public inbox for linux-s390@vger.kernel.org
 help / color / mirror / Atom feed
From: Alex Williamson <alex.williamson@redhat.com>
To: Yi Liu <yi.l.liu@intel.com>
Cc: jgg@nvidia.com, kevin.tian@intel.com, joro@8bytes.org,
	robin.murphy@arm.com, cohuck@redhat.com, eric.auger@redhat.com,
	nicolinc@nvidia.com, kvm@vger.kernel.org, mjrosato@linux.ibm.com,
	chao.p.peng@linux.intel.com, yi.y.sun@linux.intel.com,
	peterx@redhat.com, jasowang@redhat.com,
	shameerali.kolothum.thodi@huawei.com, lulu@redhat.com,
	suravee.suthikulpanit@amd.com,
	intel-gvt-dev@lists.freedesktop.org,
	intel-gfx@lists.freedesktop.org, linux-s390@vger.kernel.org,
	xudong.hao@intel.com, yan.y.zhao@intel.com,
	terrence.xu@intel.com, yanting.jiang@intel.com
Subject: Re: [PATCH v3 05/12] vfio/pci: Allow passing zero-length fd array in VFIO_DEVICE_PCI_HOT_RESET
Date: Tue, 4 Apr 2023 14:18:38 -0600	[thread overview]
Message-ID: <20230404141838.6a4efdd4.alex.williamson@redhat.com> (raw)
In-Reply-To: <20230401144429.88673-6-yi.l.liu@intel.com>

On Sat,  1 Apr 2023 07:44:22 -0700
Yi Liu <yi.l.liu@intel.com> wrote:

> as an alternative method for ownership check when iommufd is used. In
> this case all opened devices in the affected dev_set are verified to
> be bound to a same valid iommufd value to allow reset. It's simpler
> and faster as user does not need to pass a set of fds and kernel no
> need to search the device within the given fds.
> 
> a device in noiommu mode doesn't have a valid iommufd, so this method
> should not be used in a dev_set which contains multiple devices and one
> of them is in noiommu. The only allowed noiommu scenario is that the
> calling device is noiommu and it's in a singleton dev_set.
> 
> Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.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>
> ---
>  drivers/vfio/pci/vfio_pci_core.c | 42 +++++++++++++++++++++++++++-----
>  include/uapi/linux/vfio.h        |  9 ++++++-
>  2 files changed, 44 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
> index 3696b8e58445..b68fcba67a4b 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -180,7 +180,8 @@ static void vfio_pci_probe_mmaps(struct vfio_pci_core_device *vdev)
>  struct vfio_pci_group_info;
>  static void vfio_pci_dev_set_try_reset(struct vfio_device_set *dev_set);
>  static int vfio_pci_dev_set_hot_reset(struct vfio_device_set *dev_set,
> -				      struct vfio_pci_group_info *groups);
> +				      struct vfio_pci_group_info *groups,
> +				      struct iommufd_ctx *iommufd_ctx);
>  
>  /*
>   * INTx masking requires the ability to disable INTx signaling via PCI_COMMAND
> @@ -1277,7 +1278,7 @@ vfio_pci_ioctl_pci_hot_reset_groups(struct vfio_pci_core_device *vdev,
>  		return ret;
>  
>  	/* Somewhere between 1 and count is OK */
> -	if (!hdr->count || hdr->count > count)
> +	if (hdr->count > count)
>  		return -EINVAL;
>  
>  	group_fds = kcalloc(hdr->count, sizeof(*group_fds), GFP_KERNEL);
> @@ -1326,7 +1327,7 @@ vfio_pci_ioctl_pci_hot_reset_groups(struct vfio_pci_core_device *vdev,
>  	info.count = hdr->count;
>  	info.files = files;
>  
> -	ret = vfio_pci_dev_set_hot_reset(vdev->vdev.dev_set, &info);
> +	ret = vfio_pci_dev_set_hot_reset(vdev->vdev.dev_set, &info, NULL);
>  
>  hot_reset_release:
>  	for (file_idx--; file_idx >= 0; file_idx--)
> @@ -1341,6 +1342,7 @@ static int vfio_pci_ioctl_pci_hot_reset(struct vfio_pci_core_device *vdev,
>  {
>  	unsigned long minsz = offsetofend(struct vfio_pci_hot_reset, count);
>  	struct vfio_pci_hot_reset hdr;
> +	struct iommufd_ctx *iommufd;
>  	bool slot = false;
>  
>  	if (copy_from_user(&hdr, arg, minsz))
> @@ -1355,7 +1357,12 @@ static int vfio_pci_ioctl_pci_hot_reset(struct vfio_pci_core_device *vdev,
>  	else if (pci_probe_reset_bus(vdev->pdev->bus))
>  		return -ENODEV;
>  
> -	return vfio_pci_ioctl_pci_hot_reset_groups(vdev, &hdr, slot, arg);
> +	if (hdr.count)
> +		return vfio_pci_ioctl_pci_hot_reset_groups(vdev, &hdr, slot, arg);
> +
> +	iommufd = vfio_iommufd_physical_ictx(&vdev->vdev);
> +
> +	return vfio_pci_dev_set_hot_reset(vdev->vdev.dev_set, NULL, iommufd);
>  }
>  
>  static int vfio_pci_ioctl_ioeventfd(struct vfio_pci_core_device *vdev,
> @@ -2327,6 +2334,9 @@ static bool vfio_dev_in_groups(struct vfio_pci_core_device *vdev,
>  {
>  	unsigned int i;
>  
> +	if (!groups)
> +		return false;
> +
>  	for (i = 0; i < groups->count; i++)
>  		if (vfio_file_has_dev(groups->files[i], &vdev->vdev))
>  			return true;
> @@ -2402,13 +2412,25 @@ static int vfio_pci_dev_set_pm_runtime_get(struct vfio_device_set *dev_set)
>  	return ret;
>  }
>  
> +static bool vfio_dev_in_iommufd_ctx(struct vfio_pci_core_device *vdev,
> +				    struct iommufd_ctx *iommufd_ctx)
> +{
> +	struct iommufd_ctx *iommufd = vfio_iommufd_physical_ictx(&vdev->vdev);
> +
> +	if (!iommufd)
> +		return false;
> +
> +	return iommufd == iommufd_ctx;
> +}
> +
>  /*
>   * We need to get memory_lock for each device, but devices can share mmap_lock,
>   * therefore we need to zap and hold the vma_lock for each device, and only then
>   * get each memory_lock.
>   */
>  static int vfio_pci_dev_set_hot_reset(struct vfio_device_set *dev_set,
> -				      struct vfio_pci_group_info *groups)
> +				      struct vfio_pci_group_info *groups,
> +				      struct iommufd_ctx *iommufd_ctx)
>  {
>  	struct vfio_pci_core_device *cur_mem;
>  	struct vfio_pci_core_device *cur_vma;
> @@ -2448,9 +2470,17 @@ static int vfio_pci_dev_set_hot_reset(struct vfio_device_set *dev_set,
>  		 *
>  		 * Otherwise all opened devices in the dev_set must be
>  		 * contained by the set of groups provided by the user.
> +		 *
> +		 * If user provides a zero-length array, then all the
> +		 * opened devices must be bound to a same iommufd_ctx.
> +		 *
> +		 * If all above checks are failed, reset is allowed only if
> +		 * the calling device is in a singleton dev_set.
>  		 */
>  		if (cur_vma->vdev.open_count &&
> -		    !vfio_dev_in_groups(cur_vma, groups)) {
> +		    !vfio_dev_in_groups(cur_vma, groups) &&
> +		    !vfio_dev_in_iommufd_ctx(cur_vma, iommufd_ctx) &&
> +		    (dev_set->device_count > 1)) {

This last condition looks buggy to me, we need all conditions to be
true to generate an error here, which means that for a singleton
dev_set, it doesn't matter what group fds are passed, if any, or whether
the iommufd context matches.  I think in fact this means that the empty
array path is equally available for group use cases with a singleton
dev_set, but we don't enable it for multiple device dev_sets like we do
iommufd.

You pointed out a previous issue with hot-reset info and no-iommu where
if other affected devices are not bound to vfio-pci the info ioctl
returns error.  That's handled in the hot-reset ioctl by the fact that
all affected devices must be in the dev_set and therefore bound to
vfio-pci drivers.  So it seems to me that aside from the spurious error
because we can't report an iommu group when none exists, and didn't
spot it to invent an invalid group for debugging, hot-reset otherwise
works with no-iommu just like it does for iommu backed devices.  We
don't currently require singleton no-iommu dev_sets afaict.

I'll also note that if the dev_set is singleton, this suggests that
pci_reset_function() can make use of bus reset, so a hot-reset is
accessible via VFIO_DEVICE_RESET if the appropriate reset method is
selected.

Therefore, I think as written, the singleton dev_set hot-reset is
enabled for iommufd and (unintentionally?) for the group path, while
also negating a requirement for a group fd or that a provided group fd
actually matches the device in this latter case.  The null-array
approach is not however extended to groups for more general use.
Additionally, limiting no-iommu hot-reset to singleton dev_sets
provides only a marginal functional difference vs VFIO_DEVICE_RESET.
Thanks,

Alex

>  			ret = -EINVAL;
>  			goto err_undo;
>  		}
> diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h
> index f96e5689cffc..17aa5d09db41 100644
> --- a/include/uapi/linux/vfio.h
> +++ b/include/uapi/linux/vfio.h
> @@ -679,7 +679,14 @@ struct vfio_pci_hot_reset_info {
>   * the calling user must ensure all affected devices, if opened, are
>   * owned by itself.
>   *
> - * The ownership is proved by an array of group fds.
> + * The ownership can be proved by:
> + *   - An array of group fds
> + *   - A zero-length array
> + *
> + * In the last case all affected devices which are opened by this user
> + * must have been bound to a same iommufd. If the calling device is in
> + * noiommu mode (no valid iommufd) then it can be reset only if the reset
> + * doesn't affect other devices.
>   *
>   * Return: 0 on success, -errno on failure.
>   */


  parent reply	other threads:[~2023-04-04 20:19 UTC|newest]

Thread overview: 142+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-01 14:44 [PATCH v3 00/12] Introduce new methods for verifying ownership in vfio PCI hot reset Yi Liu
2023-04-01 14:44 ` [PATCH v3 01/12] vfio/pci: Update comment around group_fd get in vfio_pci_ioctl_pci_hot_reset() Yi Liu
2023-04-04 13:59   ` Eric Auger
2023-04-04 14:37     ` Liu, Yi L
2023-04-01 14:44 ` [PATCH v3 02/12] vfio/pci: Only check ownership of opened devices in hot reset Yi Liu
2023-04-04 13:59   ` Eric Auger
2023-04-04 14:37     ` Liu, Yi L
2023-04-04 15:18       ` Eric Auger
2023-04-04 15:29         ` Liu, Yi L
2023-04-04 15:59           ` Eric Auger
2023-04-05 11:41             ` Jason Gunthorpe
2023-04-05 15:14               ` Eric Auger
2023-04-01 14:44 ` [PATCH v3 03/12] vfio/pci: Move the existing hot reset logic to be a helper Yi Liu
2023-04-04 13:59   ` Eric Auger
2023-04-04 14:24     ` Liu, Yi L
2023-04-01 14:44 ` [PATCH v3 04/12] vfio-iommufd: Add helper to retrieve iommufd_ctx and devid for vfio_device Yi Liu
2023-04-04 15:28   ` Eric Auger
2023-04-04 21:48     ` Alex Williamson
2023-04-21  7:11       ` Liu, Yi L
2023-04-01 14:44 ` [PATCH v3 05/12] vfio/pci: Allow passing zero-length fd array in VFIO_DEVICE_PCI_HOT_RESET Yi Liu
2023-04-04 16:54   ` Eric Auger
2023-04-04 20:18   ` Alex Williamson [this message]
2023-04-05  7:55     ` Liu, Yi L
2023-04-05  8:01       ` Liu, Yi L
2023-04-05 15:36         ` Alex Williamson
2023-04-05 16:46           ` Jason Gunthorpe
2023-04-05  8:02     ` Eric Auger
2023-04-05  8:09       ` Liu, Yi L
2023-04-01 14:44 ` [PATCH v3 06/12] vfio: Refine vfio file kAPIs for vfio PCI hot reset Yi Liu
2023-04-05  8:27   ` Eric Auger
2023-04-05  9:23     ` Liu, Yi L
2023-04-01 14:44 ` [PATCH v3 07/12] vfio: Accpet device file from vfio PCI hot reset path Yi Liu
2023-04-04 20:31   ` Alex Williamson
2023-04-05  8:07   ` Eric Auger
2023-04-05  8:10     ` Liu, Yi L
2023-04-01 14:44 ` [PATCH v3 08/12] vfio/pci: Renaming for accepting device fd in " Yi Liu
2023-04-04 21:23   ` Alex Williamson
2023-04-05  9:32   ` Eric Auger
2023-04-01 14:44 ` [PATCH v3 09/12] vfio/pci: Accept device fd in VFIO_DEVICE_PCI_HOT_RESET ioctl Yi Liu
2023-04-05  9:36   ` Eric Auger
2023-04-01 14:44 ` [PATCH v3 10/12] vfio: Mark cdev usage in vfio_device Yi Liu
2023-04-05 11:48   ` Eric Auger
2023-04-21  7:06     ` Liu, Yi L
2023-04-01 14:44 ` [PATCH v3 11/12] iommufd: Define IOMMUFD_INVALID_ID in uapi Yi Liu
2023-04-04 21:00   ` Alex Williamson
2023-04-05  9:31     ` Liu, Yi L
2023-04-05 15:13       ` Alex Williamson
2023-04-05 15:17         ` Liu, Yi L
2023-04-05 11:46   ` Eric Auger
2023-04-01 14:44 ` [PATCH v3 12/12] vfio/pci: Report dev_id in VFIO_DEVICE_GET_PCI_HOT_RESET_INFO Yi Liu
2023-04-03  9:25   ` Liu, Yi L
2023-04-03 15:01     ` Alex Williamson
2023-04-03 15:22       ` Liu, Yi L
2023-04-03 15:32         ` Alex Williamson
2023-04-03 16:12           ` Jason Gunthorpe
2023-04-07 10:09       ` Liu, Yi L
2023-04-07 12:03         ` Alex Williamson
2023-04-07 13:24           ` Liu, Yi L
2023-04-07 13:51             ` Alex Williamson
2023-04-07 14:04               ` Liu, Yi L
2023-04-07 15:14                 ` Alex Williamson
2023-04-07 15:47                   ` Liu, Yi L
2023-04-07 21:07                     ` Alex Williamson
2023-04-08  5:07                       ` Liu, Yi L
2023-04-08 14:20                         ` Alex Williamson
2023-04-09 11:58                           ` Yi Liu
2023-04-09 13:29                             ` Alex Williamson
2023-04-10  8:48                               ` Liu, Yi L
2023-04-10 14:41                                 ` Alex Williamson
2023-04-10 15:18                                   ` Liu, Yi L
2023-04-10 15:23                                     ` Alex Williamson
2023-04-11 13:34                               ` Jason Gunthorpe
2023-04-11 13:33                       ` Jason Gunthorpe
2023-04-11  6:16           ` Liu, Yi L
2023-04-04 22:20   ` Alex Williamson
2023-04-05 12:19   ` Eric Auger
2023-04-05 14:04     ` Liu, Yi L
2023-04-05 16:25       ` Alex Williamson
2023-04-05 16:37         ` Jason Gunthorpe
2023-04-05 16:52           ` Alex Williamson
2023-04-05 17:23             ` Jason Gunthorpe
2023-04-05 18:56               ` Alex Williamson
2023-04-05 19:18                 ` Alex Williamson
2023-04-05 19:21                 ` Jason Gunthorpe
2023-04-05 19:49                   ` Alex Williamson
2023-04-05 23:22                     ` Jason Gunthorpe
2023-04-06 10:02                       ` Liu, Yi L
2023-04-06 17:53                         ` Alex Williamson
2023-04-07 10:09                           ` Liu, Yi L
2023-04-11 13:24                           ` Jason Gunthorpe
     [not found]                             ` <20230411095417.240bac39.alex.williamson@redhat.com>
     [not found]                               ` <20230411111117.0766ad52.alex.williamson@redhat.com>
2023-04-11 18:40                                 ` Jason Gunthorpe
2023-04-11 21:58                                   ` Alex Williamson
2023-04-12  0:01                                     ` Jason Gunthorpe
2023-04-12  7:27                                       ` Tian, Kevin
2023-04-12 15:05                                         ` Jason Gunthorpe
2023-04-12 17:01                                           ` Alex Williamson
2023-04-13  2:57                                           ` Tian, Kevin
2023-04-12 10:09                                       ` Liu, Yi L
2023-04-12 16:54                                         ` Alex Williamson
2023-04-12 16:50                                       ` Alex Williamson
2023-04-12 20:06                                         ` Jason Gunthorpe
2023-04-13  8:25                                           ` Tian, Kevin
2023-04-13 11:50                                             ` Jason Gunthorpe
2023-04-13 14:35                                               ` Liu, Yi L
2023-04-13 14:41                                                 ` Jason Gunthorpe
2023-04-13 18:07                                               ` Alex Williamson
2023-04-14  9:11                                                 ` Tian, Kevin
2023-04-14 11:38                                                   ` Liu, Yi L
2023-04-14 17:10                                                     ` Alex Williamson
2023-04-17  4:20                                                       ` Liu, Yi L
2023-04-17 19:01                                                         ` Alex Williamson
2023-04-17 19:31                                                           ` Jason Gunthorpe
2023-04-17 20:06                                                             ` Alex Williamson
2023-04-18  3:24                                                               ` Tian, Kevin
2023-04-18  4:10                                                                 ` Alex Williamson
2023-04-18  5:02                                                                   ` Tian, Kevin
2023-04-18 12:59                                                                     ` Jason Gunthorpe
2023-04-18 16:44                                                                     ` Alex Williamson
2023-04-18 10:34                                                                   ` Liu, Yi L
2023-04-18 16:49                                                                     ` Alex Williamson
2023-04-18 12:57                                                               ` Jason Gunthorpe
2023-04-18 18:39                                                                 ` Alex Williamson
2023-04-20 12:10                                                                   ` Liu, Yi L
2023-04-20 14:08                                                                     ` Alex Williamson
2023-04-21 22:35                                                                       ` Jason Gunthorpe
2023-04-23 14:46                                                                         ` Liu, Yi L
2023-04-26  7:22                                                                       ` Liu, Yi L
2023-04-26 13:20                                                                         ` Alex Williamson
2023-04-26 15:08                                                                           ` Liu, Yi L
2023-04-14 16:34                                                   ` Alex Williamson
2023-04-17 13:39                                                   ` Jason Gunthorpe
2023-04-18  1:28                                                     ` Tian, Kevin
2023-04-18 10:23                                                     ` Liu, Yi L
2023-04-18 13:02                                                       ` Jason Gunthorpe
2023-04-23 10:28                                                         ` Liu, Yi L
2023-04-24 17:38                                                           ` Jason Gunthorpe
2023-04-17 14:05                                                 ` Jason Gunthorpe
2023-04-12  7:14                                     ` Tian, Kevin
2023-04-06  6:34                     ` Liu, Yi L
2023-04-06 17:07                       ` Alex Williamson
2023-04-05 17:58         ` Eric Auger
2023-04-06  5:31           ` Liu, Yi L

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230404141838.6a4efdd4.alex.williamson@redhat.com \
    --to=alex.williamson@redhat.com \
    --cc=chao.p.peng@linux.intel.com \
    --cc=cohuck@redhat.com \
    --cc=eric.auger@redhat.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-gvt-dev@lists.freedesktop.org \
    --cc=jasowang@redhat.com \
    --cc=jgg@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=lulu@redhat.com \
    --cc=mjrosato@linux.ibm.com \
    --cc=nicolinc@nvidia.com \
    --cc=peterx@redhat.com \
    --cc=robin.murphy@arm.com \
    --cc=shameerali.kolothum.thodi@huawei.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=terrence.xu@intel.com \
    --cc=xudong.hao@intel.com \
    --cc=yan.y.zhao@intel.com \
    --cc=yanting.jiang@intel.com \
    --cc=yi.l.liu@intel.com \
    --cc=yi.y.sun@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox