]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
vfio_pci: Allow mapping extra regions
authorAlexey Kardashevskiy <aik@ozlabs.ru>
Wed, 19 Dec 2018 08:52:30 +0000 (19:52 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 21 Dec 2018 05:20:47 +0000 (16:20 +1100)
So far we only allowed mapping of MMIO BARs to the userspace. However
there are GPUs with on-board coherent RAM accessible via side
channels which we also want to map to the userspace. The first client
for this is NVIDIA V100 GPU with NVLink2 direct links to a POWER9
NPU-enabled CPU; such GPUs have 16GB RAM which is coherently mapped
to the system address space, we are going to export these as an extra
PCI region.

We already support extra PCI regions and this adds support for mapping
them to the userspace.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
drivers/vfio/pci/vfio_pci.c
drivers/vfio/pci/vfio_pci_private.h

index 50cdedfca9fec2d01aaa4b5596a71722969e9a1a..9a86470f4ed9fce236d942dea1c1222731b412f7 100644 (file)
@@ -1117,6 +1117,15 @@ static int vfio_pci_mmap(void *device_data, struct vm_area_struct *vma)
                return -EINVAL;
        if ((vma->vm_flags & VM_SHARED) == 0)
                return -EINVAL;
+       if (index >= VFIO_PCI_NUM_REGIONS) {
+               int regnum = index - VFIO_PCI_NUM_REGIONS;
+               struct vfio_pci_region *region = vdev->region + regnum;
+
+               if (region && region->ops && region->ops->mmap &&
+                   (region->flags & VFIO_REGION_INFO_FLAG_MMAP))
+                       return region->ops->mmap(vdev, region, vma);
+               return -EINVAL;
+       }
        if (index >= VFIO_PCI_ROM_REGION_INDEX)
                return -EINVAL;
        if (!vdev->bar_mmap_supported[index])
index cde3b5d3441ad5e98a579d0050317245216ce36c..86aab05d3d46b848ae4576d5aca5694da8ac1cfe 100644 (file)
@@ -59,6 +59,9 @@ struct vfio_pci_regops {
                      size_t count, loff_t *ppos, bool iswrite);
        void    (*release)(struct vfio_pci_device *vdev,
                           struct vfio_pci_region *region);
+       int     (*mmap)(struct vfio_pci_device *vdev,
+                       struct vfio_pci_region *region,
+                       struct vm_area_struct *vma);
 };
 
 struct vfio_pci_region {