Commit c157fd88 authored by Nicolin Chen's avatar Nicolin Chen Committed by Jason Gunthorpe
Browse files

vfio: Support IO page table replacement

Now both the physical path and the emulated path can support an IO page
table replacement. Call iommufd_device_replace/iommufd_access_replace(),
when vdev->iommufd_attached is true.

Also update the VFIO_DEVICE_ATTACH_IOMMUFD_PT kdoc in the uAPI header.

Link: https://lore.kernel.org/r/b5f01956ff161f76aa52c95b0fa1ad6eaca95c4a.1690523699.git.nicolinc@nvidia.com


Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Reviewed-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Reviewed-by: default avatarAlex Williamson <alex.williamson@redhat.com>
Signed-off-by: default avatarNicolin Chen <nicolinc@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent c154660b
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -146,8 +146,8 @@ int vfio_iommufd_physical_attach_ioas(struct vfio_device *vdev, u32 *pt_id)
		return -EINVAL;

	if (vdev->iommufd_attached)
		return -EBUSY;

		rc = iommufd_device_replace(vdev->iommufd_device, pt_id);
	else
		rc = iommufd_device_attach(vdev->iommufd_device, pt_id);
	if (rc)
		return rc;
@@ -223,7 +223,8 @@ int vfio_iommufd_emulated_attach_ioas(struct vfio_device *vdev, u32 *pt_id)
	lockdep_assert_held(&vdev->dev_set->lock);

	if (vdev->iommufd_attached)
		return -EBUSY;
		rc = iommufd_access_replace(vdev->iommufd_access, *pt_id);
	else
		rc = iommufd_access_attach(vdev->iommufd_access, *pt_id);
	if (rc)
		return rc;
+6 −0
Original line number Diff line number Diff line
@@ -939,6 +939,12 @@ struct vfio_device_bind_iommufd {
 * Undo by VFIO_DEVICE_DETACH_IOMMUFD_PT or device fd close.  This is only
 * allowed on cdev fds.
 *
 * If a vfio device is currently attached to a valid hw_pagetable, without doing
 * a VFIO_DEVICE_DETACH_IOMMUFD_PT, a second VFIO_DEVICE_ATTACH_IOMMUFD_PT ioctl
 * passing in another hw_pagetable (hwpt) id is allowed. This action, also known
 * as a hw_pagetable replacement, will replace the device's currently attached
 * hw_pagetable with a new hw_pagetable corresponding to the given pt_id.
 *
 * Return: 0 on success, -errno on failure.
 */
struct vfio_device_attach_iommufd_pt {