Message ID | 600343ffb282ff3bed5eb98a9255c0084d01a859.1678284812.git.nicolinc@nvidia.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add IO page table replacement support | expand |
> From: Nicolin Chen <nicolinc@nvidia.com> > Sent: Wednesday, March 8, 2023 10:26 PM > > Now both the physical path and the emulated path should support an IO > page > table replacement. > > Call iommufd_device_replace() when vdev->iommufd_attached is true. > why is replace enabled only in physical path in this patch?
On Fri, Mar 10, 2023 at 11:53:56AM +0000, Tian, Kevin wrote: > External email: Use caution opening links or attachments > > > > From: Nicolin Chen <nicolinc@nvidia.com> > > Sent: Wednesday, March 8, 2023 10:26 PM > > > > Now both the physical path and the emulated path should support an IO > > page > > table replacement. > > > > Call iommufd_device_replace() when vdev->iommufd_attached is true. > > > > why is replace enabled only in physical path in this patch? The emulated pathway does not call iommufd_device_attach() but iommufd_access_set_ioas() in the other patch, which internally takes care of the replacement for the access pointer. Thanks Nic
> From: Nicolin Chen <nicolinc@nvidia.com> > Sent: Saturday, March 11, 2023 7:38 AM > > On Fri, Mar 10, 2023 at 11:53:56AM +0000, Tian, Kevin wrote: > > External email: Use caution opening links or attachments > > > > > > > From: Nicolin Chen <nicolinc@nvidia.com> > > > Sent: Wednesday, March 8, 2023 10:26 PM > > > > > > Now both the physical path and the emulated path should support an IO > > > page > > > table replacement. > > > > > > Call iommufd_device_replace() when vdev->iommufd_attached is true. > > > > > > > why is replace enabled only in physical path in this patch? > > The emulated pathway does not call iommufd_device_attach() but > iommufd_access_set_ioas() in the other patch, which internally > takes care of the replacement for the access pointer. > I thought there is a similar check as in physical path which should be removed: if (vdev->iommufd_attached) - return -EBUSY; but looks it's not the case for the emulated path.
diff --git a/drivers/vfio/iommufd.c b/drivers/vfio/iommufd.c index 8a9457d0a33c..a245a8e0c8ab 100644 --- a/drivers/vfio/iommufd.c +++ b/drivers/vfio/iommufd.c @@ -145,9 +145,9 @@ int vfio_iommufd_physical_attach_ioas(struct vfio_device *vdev, u32 *pt_id) return -EINVAL; if (vdev->iommufd_attached) - return -EBUSY; - - rc = iommufd_device_attach(vdev->iommufd_device, pt_id); + rc = iommufd_device_replace(vdev->iommufd_device, pt_id); + else + rc = iommufd_device_attach(vdev->iommufd_device, pt_id); if (rc) return rc; vdev->iommufd_attached = true; diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index 692156a708bb..14375826a25b 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -243,6 +243,12 @@ struct vfio_device_bind_iommufd { * * Undo by VFIO_DEVICE_DETACH_IOMMUFD_PT or device fd close. * + * 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. + * * @argsz: user filled size of this data. * @flags: must be 0. * @pt_id: Input the target id which can represent an ioas or a hwpt
Now both the physical path and the emulated path should support an IO page table replacement. Call iommufd_device_replace() when vdev->iommufd_attached is true. Also update the VFIO_DEVICE_ATTACH_IOMMUFD_PT kdoc in the uAPI header. Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> --- drivers/vfio/iommufd.c | 6 +++--- include/uapi/linux/vfio.h | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-)