Message ID | 6-v2-6011bde8e0a1+5f-vfio_mdev_no_group_jgg@nvidia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Make the rest of the VFIO driver interface use vfio_device | expand |
> From: Jason Gunthorpe <jgg@nvidia.com> > Sent: Friday, April 22, 2022 12:29 AM > > Now that callers have been updated to use the vfio_device APIs the driver > facing group interface is no longer used, delete it: > > - vfio_group_get_external_user_from_dev() > - vfio_group_pin_pages() > - vfio_group_unpin_pages() > - vfio_group_iommu_domain() > > Reviewed-by: Christoph Hellwig <hch@lst.de> > Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> > --- > drivers/vfio/vfio.c | 151 ------------------------------------------- > include/linux/vfio.h | 11 ---- > 2 files changed, 162 deletions(-) > > vfio_group_put_external_user() is removable too when combined with the > KVM series > > diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c > index d10d20d393b706..ba6fae95555ec7 100644 > --- a/drivers/vfio/vfio.c > +++ b/drivers/vfio/vfio.c > @@ -1947,44 +1947,6 @@ struct vfio_group > *vfio_group_get_external_user(struct file *filep) > } > EXPORT_SYMBOL_GPL(vfio_group_get_external_user); > > -/* > - * External user API, exported by symbols to be linked dynamically. > - * The external user passes in a device pointer > - * to verify that: > - * - A VFIO group is assiciated with the device; > - * - IOMMU is set for the group. > - * If both checks passed, vfio_group_get_external_user_from_dev() > - * increments the container user counter to prevent the VFIO group > - * from disposal before external user exits and returns the pointer > - * to the VFIO group. > - * > - * When the external user finishes using the VFIO group, it calls > - * vfio_group_put_external_user() to release the VFIO group and > - * decrement the container user counter. > - * > - * @dev [in] : device > - * Return error PTR or pointer to VFIO group. > - */ > - > -struct vfio_group *vfio_group_get_external_user_from_dev(struct device > *dev) > -{ > - struct vfio_group *group; > - int ret; > - > - group = vfio_group_get_from_dev(dev); > - if (!group) > - return ERR_PTR(-ENODEV); > - > - ret = vfio_group_add_container_user(group); > - if (ret) { > - vfio_group_put(group); > - return ERR_PTR(ret); > - } > - > - return group; > -} > -EXPORT_SYMBOL_GPL(vfio_group_get_external_user_from_dev); > - > void vfio_group_put_external_user(struct vfio_group *group) > { > vfio_group_try_dissolve_container(group); > @@ -2218,101 +2180,6 @@ int vfio_unpin_pages(struct vfio_device *vdev, > unsigned long *user_pfn, > } > EXPORT_SYMBOL(vfio_unpin_pages); > > -/* > - * Pin a set of guest IOVA PFNs and return their associated host PFNs for a > - * VFIO group. > - * > - * The caller needs to call vfio_group_get_external_user() or > - * vfio_group_get_external_user_from_dev() prior to calling this interface, > - * so as to prevent the VFIO group from disposal in the middle of the call. > - * But it can keep the reference to the VFIO group for several calls into > - * this interface. > - * After finishing using of the VFIO group, the caller needs to release the > - * VFIO group by calling vfio_group_put_external_user(). > - * > - * @group [in] : VFIO group > - * @user_iova_pfn [in] : array of user/guest IOVA PFNs to be pinned. > - * @npage [in] : count of elements in user_iova_pfn array. > - * This count should not be greater > - * VFIO_PIN_PAGES_MAX_ENTRIES. > - * @prot [in] : protection flags > - * @phys_pfn [out] : array of host PFNs > - * Return error or number of pages pinned. > - */ > -int vfio_group_pin_pages(struct vfio_group *group, > - unsigned long *user_iova_pfn, int npage, > - int prot, unsigned long *phys_pfn) > -{ > - struct vfio_container *container; > - struct vfio_iommu_driver *driver; > - int ret; > - > - if (!group || !user_iova_pfn || !phys_pfn || !npage) > - return -EINVAL; > - > - if (group->dev_counter > 1) > - return -EINVAL; > - > - if (npage > VFIO_PIN_PAGES_MAX_ENTRIES) > - return -E2BIG; > - > - container = group->container; > - driver = container->iommu_driver; > - if (likely(driver && driver->ops->pin_pages)) > - ret = driver->ops->pin_pages(container->iommu_data, > - group->iommu_group, > user_iova_pfn, > - npage, prot, phys_pfn); > - else > - ret = -ENOTTY; > - > - return ret; > -} > -EXPORT_SYMBOL(vfio_group_pin_pages); > - > -/* > - * Unpin a set of guest IOVA PFNs for a VFIO group. > - * > - * The caller needs to call vfio_group_get_external_user() or > - * vfio_group_get_external_user_from_dev() prior to calling this interface, > - * so as to prevent the VFIO group from disposal in the middle of the call. > - * But it can keep the reference to the VFIO group for several calls into > - * this interface. > - * After finishing using of the VFIO group, the caller needs to release the > - * VFIO group by calling vfio_group_put_external_user(). > - * > - * @group [in] : vfio group > - * @user_iova_pfn [in] : array of user/guest IOVA PFNs to be > unpinned. > - * @npage [in] : count of elements in user_iova_pfn array. > - * This count should not be greater than > - * VFIO_PIN_PAGES_MAX_ENTRIES. > - * Return error or number of pages unpinned. > - */ > -int vfio_group_unpin_pages(struct vfio_group *group, > - unsigned long *user_iova_pfn, int npage) > -{ > - struct vfio_container *container; > - struct vfio_iommu_driver *driver; > - int ret; > - > - if (!group || !user_iova_pfn || !npage) > - return -EINVAL; > - > - if (npage > VFIO_PIN_PAGES_MAX_ENTRIES) > - return -E2BIG; > - > - container = group->container; > - driver = container->iommu_driver; > - if (likely(driver && driver->ops->unpin_pages)) > - ret = driver->ops->unpin_pages(container->iommu_data, > - user_iova_pfn, npage); > - else > - ret = -ENOTTY; > - > - return ret; > -} > -EXPORT_SYMBOL(vfio_group_unpin_pages); > - > - > /* > * This interface allows the CPUs to perform some sort of virtual DMA on > * behalf of the device. > @@ -2515,24 +2382,6 @@ int vfio_unregister_notifier(struct vfio_device > *dev, > } > EXPORT_SYMBOL(vfio_unregister_notifier); > > -struct iommu_domain *vfio_group_iommu_domain(struct vfio_group > *group) > -{ > - struct vfio_container *container; > - struct vfio_iommu_driver *driver; > - > - if (!group) > - return ERR_PTR(-EINVAL); > - > - container = group->container; > - driver = container->iommu_driver; > - if (likely(driver && driver->ops->group_iommu_domain)) > - return driver->ops->group_iommu_domain(container- > >iommu_data, > - group->iommu_group); > - > - return ERR_PTR(-ENOTTY); > -} > -EXPORT_SYMBOL_GPL(vfio_group_iommu_domain); > - > /* > * Module/class support > */ > diff --git a/include/linux/vfio.h b/include/linux/vfio.h > index 91d46e532ca104..9a9981c2622896 100644 > --- a/include/linux/vfio.h > +++ b/include/linux/vfio.h > @@ -140,8 +140,6 @@ int vfio_mig_get_next_state(struct vfio_device > *device, > */ > extern struct vfio_group *vfio_group_get_external_user(struct file *filep); > extern void vfio_group_put_external_user(struct vfio_group *group); > -extern struct vfio_group *vfio_group_get_external_user_from_dev(struct > device > - *dev); > extern bool vfio_external_group_match_file(struct vfio_group *group, > struct file *filep); > extern int vfio_external_user_iommu_id(struct vfio_group *group); > @@ -154,18 +152,9 @@ extern int vfio_pin_pages(struct vfio_device *vdev, > unsigned long *user_pfn, > int npage, int prot, unsigned long *phys_pfn); > extern int vfio_unpin_pages(struct vfio_device *vdev, unsigned long > *user_pfn, > int npage); > - > -extern int vfio_group_pin_pages(struct vfio_group *group, > - unsigned long *user_iova_pfn, int npage, > - int prot, unsigned long *phys_pfn); > -extern int vfio_group_unpin_pages(struct vfio_group *group, > - unsigned long *user_iova_pfn, int npage); > - > extern int vfio_dma_rw(struct vfio_device *vdev, dma_addr_t user_iova, > void *data, size_t len, bool write); > > -extern struct iommu_domain *vfio_group_iommu_domain(struct > vfio_group *group); > - > /* each type has independent events */ > enum vfio_notify_type { > VFIO_IOMMU_NOTIFY = 0, > -- > 2.36.0
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index d10d20d393b706..ba6fae95555ec7 100644 --- a/drivers/vfio/vfio.c +++ b/drivers/vfio/vfio.c @@ -1947,44 +1947,6 @@ struct vfio_group *vfio_group_get_external_user(struct file *filep) } EXPORT_SYMBOL_GPL(vfio_group_get_external_user); -/* - * External user API, exported by symbols to be linked dynamically. - * The external user passes in a device pointer - * to verify that: - * - A VFIO group is assiciated with the device; - * - IOMMU is set for the group. - * If both checks passed, vfio_group_get_external_user_from_dev() - * increments the container user counter to prevent the VFIO group - * from disposal before external user exits and returns the pointer - * to the VFIO group. - * - * When the external user finishes using the VFIO group, it calls - * vfio_group_put_external_user() to release the VFIO group and - * decrement the container user counter. - * - * @dev [in] : device - * Return error PTR or pointer to VFIO group. - */ - -struct vfio_group *vfio_group_get_external_user_from_dev(struct device *dev) -{ - struct vfio_group *group; - int ret; - - group = vfio_group_get_from_dev(dev); - if (!group) - return ERR_PTR(-ENODEV); - - ret = vfio_group_add_container_user(group); - if (ret) { - vfio_group_put(group); - return ERR_PTR(ret); - } - - return group; -} -EXPORT_SYMBOL_GPL(vfio_group_get_external_user_from_dev); - void vfio_group_put_external_user(struct vfio_group *group) { vfio_group_try_dissolve_container(group); @@ -2218,101 +2180,6 @@ int vfio_unpin_pages(struct vfio_device *vdev, unsigned long *user_pfn, } EXPORT_SYMBOL(vfio_unpin_pages); -/* - * Pin a set of guest IOVA PFNs and return their associated host PFNs for a - * VFIO group. - * - * The caller needs to call vfio_group_get_external_user() or - * vfio_group_get_external_user_from_dev() prior to calling this interface, - * so as to prevent the VFIO group from disposal in the middle of the call. - * But it can keep the reference to the VFIO group for several calls into - * this interface. - * After finishing using of the VFIO group, the caller needs to release the - * VFIO group by calling vfio_group_put_external_user(). - * - * @group [in] : VFIO group - * @user_iova_pfn [in] : array of user/guest IOVA PFNs to be pinned. - * @npage [in] : count of elements in user_iova_pfn array. - * This count should not be greater - * VFIO_PIN_PAGES_MAX_ENTRIES. - * @prot [in] : protection flags - * @phys_pfn [out] : array of host PFNs - * Return error or number of pages pinned. - */ -int vfio_group_pin_pages(struct vfio_group *group, - unsigned long *user_iova_pfn, int npage, - int prot, unsigned long *phys_pfn) -{ - struct vfio_container *container; - struct vfio_iommu_driver *driver; - int ret; - - if (!group || !user_iova_pfn || !phys_pfn || !npage) - return -EINVAL; - - if (group->dev_counter > 1) - return -EINVAL; - - if (npage > VFIO_PIN_PAGES_MAX_ENTRIES) - return -E2BIG; - - container = group->container; - driver = container->iommu_driver; - if (likely(driver && driver->ops->pin_pages)) - ret = driver->ops->pin_pages(container->iommu_data, - group->iommu_group, user_iova_pfn, - npage, prot, phys_pfn); - else - ret = -ENOTTY; - - return ret; -} -EXPORT_SYMBOL(vfio_group_pin_pages); - -/* - * Unpin a set of guest IOVA PFNs for a VFIO group. - * - * The caller needs to call vfio_group_get_external_user() or - * vfio_group_get_external_user_from_dev() prior to calling this interface, - * so as to prevent the VFIO group from disposal in the middle of the call. - * But it can keep the reference to the VFIO group for several calls into - * this interface. - * After finishing using of the VFIO group, the caller needs to release the - * VFIO group by calling vfio_group_put_external_user(). - * - * @group [in] : vfio group - * @user_iova_pfn [in] : array of user/guest IOVA PFNs to be unpinned. - * @npage [in] : count of elements in user_iova_pfn array. - * This count should not be greater than - * VFIO_PIN_PAGES_MAX_ENTRIES. - * Return error or number of pages unpinned. - */ -int vfio_group_unpin_pages(struct vfio_group *group, - unsigned long *user_iova_pfn, int npage) -{ - struct vfio_container *container; - struct vfio_iommu_driver *driver; - int ret; - - if (!group || !user_iova_pfn || !npage) - return -EINVAL; - - if (npage > VFIO_PIN_PAGES_MAX_ENTRIES) - return -E2BIG; - - container = group->container; - driver = container->iommu_driver; - if (likely(driver && driver->ops->unpin_pages)) - ret = driver->ops->unpin_pages(container->iommu_data, - user_iova_pfn, npage); - else - ret = -ENOTTY; - - return ret; -} -EXPORT_SYMBOL(vfio_group_unpin_pages); - - /* * This interface allows the CPUs to perform some sort of virtual DMA on * behalf of the device. @@ -2515,24 +2382,6 @@ int vfio_unregister_notifier(struct vfio_device *dev, } EXPORT_SYMBOL(vfio_unregister_notifier); -struct iommu_domain *vfio_group_iommu_domain(struct vfio_group *group) -{ - struct vfio_container *container; - struct vfio_iommu_driver *driver; - - if (!group) - return ERR_PTR(-EINVAL); - - container = group->container; - driver = container->iommu_driver; - if (likely(driver && driver->ops->group_iommu_domain)) - return driver->ops->group_iommu_domain(container->iommu_data, - group->iommu_group); - - return ERR_PTR(-ENOTTY); -} -EXPORT_SYMBOL_GPL(vfio_group_iommu_domain); - /* * Module/class support */ diff --git a/include/linux/vfio.h b/include/linux/vfio.h index 91d46e532ca104..9a9981c2622896 100644 --- a/include/linux/vfio.h +++ b/include/linux/vfio.h @@ -140,8 +140,6 @@ int vfio_mig_get_next_state(struct vfio_device *device, */ extern struct vfio_group *vfio_group_get_external_user(struct file *filep); extern void vfio_group_put_external_user(struct vfio_group *group); -extern struct vfio_group *vfio_group_get_external_user_from_dev(struct device - *dev); extern bool vfio_external_group_match_file(struct vfio_group *group, struct file *filep); extern int vfio_external_user_iommu_id(struct vfio_group *group); @@ -154,18 +152,9 @@ extern int vfio_pin_pages(struct vfio_device *vdev, unsigned long *user_pfn, int npage, int prot, unsigned long *phys_pfn); extern int vfio_unpin_pages(struct vfio_device *vdev, unsigned long *user_pfn, int npage); - -extern int vfio_group_pin_pages(struct vfio_group *group, - unsigned long *user_iova_pfn, int npage, - int prot, unsigned long *phys_pfn); -extern int vfio_group_unpin_pages(struct vfio_group *group, - unsigned long *user_iova_pfn, int npage); - extern int vfio_dma_rw(struct vfio_device *vdev, dma_addr_t user_iova, void *data, size_t len, bool write); -extern struct iommu_domain *vfio_group_iommu_domain(struct vfio_group *group); - /* each type has independent events */ enum vfio_notify_type { VFIO_IOMMU_NOTIFY = 0,