On Mon, Mar 08, 2021 at 02:48:16PM -0700, Alex Williamson wrote: > 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@xxxxxxxxxx> > Signed-off-by: Alex Williamson <alex.williamson@xxxxxxxxxx> > 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