Re: [PATCH v1 06/14] vfio: Add vma to pfn callback
From: Jason Gunthorpe <jgg@nvidia.com>
Date: 2021-03-09 00:34:48
Also in:
lkml
On Mon, Mar 08, 2021 at 02:48:16PM -0700, Alex Williamson wrote:
quoted hunk ↗ jump to hunk
Add a new vfio_device_ops callback to allow the bus driver to translate a vma mapping of a vfio device fd to a pfn. Plumb through vfio-core. Implemented for vfio-pci. Suggested-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Alex Williamson <redacted> drivers/vfio/pci/vfio_pci.c | 1 + drivers/vfio/vfio.c | 16 ++++++++++++++++ include/linux/vfio.h | 3 +++ 3 files changed, 20 insertions(+)diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index 415b5109da9b..585895970e9c 100644 +++ b/drivers/vfio/pci/vfio_pci.c@@ -1756,6 +1756,7 @@ static const struct vfio_device_ops vfio_pci_ops = { .mmap = vfio_pci_mmap, .request = vfio_pci_request, .match = vfio_pci_match, + .vma_to_pfn = vfio_pci_bar_vma_to_pfn, }; static int vfio_pci_reflck_attach(struct vfio_pci_device *vdev);diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index 3a3e85a0dc3e..c47895539a1a 100644 +++ b/drivers/vfio/vfio.c@@ -944,6 +944,22 @@ struct vfio_device *vfio_device_get_from_vma(struct vm_area_struct *vma) } EXPORT_SYMBOL_GPL(vfio_device_get_from_vma); +int vfio_vma_to_pfn(struct vm_area_struct *vma, unsigned long *pfn) +{ + struct vfio_device *device; + + if (!vma->vm_file || vma->vm_file->f_op != &vfio_device_fops) + return -EINVAL; + + device = vma->vm_file->private_data;
Since the caller has the vfio_device already I would pass in the
vfio_device here rather than look it up again.
If you are really worried about API mis-use then use a protective
assertion like this:
if (WARN_ON(vma->vm_file->private_data != device))
return -EINVAL;
Jason