Re: [PATCH v3 09/12] vfio/pci: Accept device fd in VFIO_DEVICE_PCI_HOT_RESET ioctl

Eric Auger
2023-04-05T09:38:14Z

On 4/1/23 16:44, Yi Liu wrote:
> Now user can also provide an array of device fds as a 3rd method to verify
> the reset ownership. It's not useful at this point when the device fds are
> acquired via group fds. But it's necessary when moving to device cdev which
> allows the user to directly acquire device fds by skipping group. In that
> case this method can be used as a last resort when the preferred iommufd
> verification doesn't work, e.g. in noiommu usages.
>
> Clarify it in uAPI.
>
> Reviewed-by: Kevin Tian <kevin.tian@intel.com>
> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
> Tested-by: Yanting Jiang <yanting.jiang@intel.com>
> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>

Eric
> ---
> drivers/vfio/pci/vfio_pci_core.c | 9 +++++----
> include/uapi/linux/vfio.h | 3 ++-
> 2 files changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
> index da6325008872..19f5b075d70a 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -1289,7 +1289,7 @@ vfio_pci_ioctl_pci_hot_reset_files(struct vfio_pci_core_device *vdev,
> return -ENOMEM;
> }
>
> - if (copy_from_user(fds, arg->group_fds,
> + if (copy_from_user(fds, arg->fds,
> hdr->count * sizeof(*fds))) {
> kfree(fds);
> kfree(files);
> @@ -1297,8 +1297,8 @@ vfio_pci_ioctl_pci_hot_reset_files(struct vfio_pci_core_device *vdev,
> }
>
> /*
> - * Get the group file for each fd to ensure the group held across
> - * the reset
> + * Get the file for each fd to ensure the group/device file
> + * is held across the reset
> */
> for (file_idx = 0; file_idx < hdr->count; file_idx++) {
> struct file *file = fget(fds[file_idx]);
> @@ -2469,7 +2469,8 @@ static int vfio_pci_dev_set_hot_reset(struct vfio_device_set *dev_set,
> * cannot race being opened by another user simultaneously.
> *
> * Otherwise all opened devices in the dev_set must be
> - * contained by the set of groups provided by the user.
> + * contained by the set of groups/devices provided by
> + * the user.
> *
> * If user provides a zero-length array, then all the
> * opened devices must be bound to a same iommufd_ctx.
> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
> index 17aa5d09db41..25432ef213ee 100644
> --- a/include/uapi/linux/vfio.h
> +++ b/include/uapi/linux/vfio.h
> @@ -681,6 +681,7 @@ struct vfio_pci_hot_reset_info {
> *
> * The ownership can be proved by:
> * - An array of group fds
> + * - An array of device fds
> * - A zero-length array
> *
> * In the last case all affected devices which are opened by this user
> @@ -694,7 +695,7 @@ struct vfio_pci_hot_reset {
> __u32 argsz;
> __u32 flags;
> __u32 count;
> - __s32 group_fds[];
> + __s32 fds[];
> };
>
> #define VFIO_DEVICE_PCI_HOT_RESET _IO(VFIO_TYPE, VFIO_BASE + 13)