Merge branch 'kvm-arm64/vfio-normal-nc' of https://git.kernel.org/pub/scm/linux/kerne...
[linux-2.6-microblaze.git] / drivers / vfio / pci / vfio_pci_core.c
index 61aa196..d94d61b 100644 (file)
@@ -1862,8 +1862,25 @@ int vfio_pci_core_mmap(struct vfio_device *core_vdev, struct vm_area_struct *vma
        /*
         * See remap_pfn_range(), called from vfio_pci_fault() but we can't
         * change vm_flags within the fault handler.  Set them now.
+        *
+        * VM_ALLOW_ANY_UNCACHED: The VMA flag is implemented for ARM64,
+        * allowing KVM stage 2 device mapping attributes to use Normal-NC
+        * rather than DEVICE_nGnRE, which allows guest mappings
+        * supporting write-combining attributes (WC). ARM does not
+        * architecturally guarantee this is safe, and indeed some MMIO
+        * regions like the GICv2 VCPU interface can trigger uncontained
+        * faults if Normal-NC is used.
+        *
+        * To safely use VFIO in KVM the platform must guarantee full
+        * safety in the guest where no action taken against a MMIO
+        * mapping can trigger an uncontained failure. The assumption is
+        * that most VFIO PCI platforms support this for both mapping types,
+        * at least in common flows, based on some expectations of how
+        * PCI IP is integrated. Hence VM_ALLOW_ANY_UNCACHED is set in
+        * the VMA flags.
         */
-       vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
+       vm_flags_set(vma, VM_ALLOW_ANY_UNCACHED | VM_IO | VM_PFNMAP |
+                       VM_DONTEXPAND | VM_DONTDUMP);
        vma->vm_ops = &vfio_pci_mmap_ops;
 
        return 0;