linux-s390.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yi Liu <yi.l.liu@intel.com>
To: alex.williamson@redhat.com, jgg@nvidia.com, kevin.tian@intel.com
Cc: 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.l.liu@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: [PATCH v8 11/24] vfio: Make vfio_device_first_open() to accept NULL iommufd for noiommu
Date: Mon, 27 Mar 2023 02:40:34 -0700	[thread overview]
Message-ID: <20230327094047.47215-12-yi.l.liu@intel.com> (raw)
In-Reply-To: <20230327094047.47215-1-yi.l.liu@intel.com>

vfio_device_first_open() requires the caller to provide either a valid
iommufd (the group path in iommufd compat mode) or a valid container
(the group path in legacy container mode). As preparation for noiommu
support in device cdev path it's extended to allow both being NULL. The
caller is expected to verify noiommu permission before passing NULL
to this function.

Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Tested-by: Terrence Xu <terrence.xu@intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
 drivers/vfio/group.c     |  8 ++++++++
 drivers/vfio/vfio.h      |  1 +
 drivers/vfio/vfio_main.c | 12 ++++++++----
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c
index c0065e359db6..36e105960dd8 100644
--- a/drivers/vfio/group.c
+++ b/drivers/vfio/group.c
@@ -771,6 +771,14 @@ void vfio_device_group_unregister(struct vfio_device *device)
 	mutex_unlock(&device->group->device_lock);
 }
 
+/* No group lock since df->group and df->group->container cannot change */
+bool vfio_device_group_uses_container(struct vfio_device_file *df)
+{
+	if (WARN_ON(!df->group))
+		return false;
+	return READ_ONCE(df->group->container);
+}
+
 int vfio_device_group_use_iommu(struct vfio_device *device)
 {
 	struct vfio_group *group = device->group;
diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h
index f1a448f9d067..7d4108cbc185 100644
--- a/drivers/vfio/vfio.h
+++ b/drivers/vfio/vfio.h
@@ -95,6 +95,7 @@ int vfio_device_set_group(struct vfio_device *device,
 void vfio_device_remove_group(struct vfio_device *device);
 void vfio_device_group_register(struct vfio_device *device);
 void vfio_device_group_unregister(struct vfio_device *device);
+bool vfio_device_group_uses_container(struct vfio_device_file *df);
 int vfio_device_group_use_iommu(struct vfio_device *device);
 void vfio_device_group_unuse_iommu(struct vfio_device *device);
 void vfio_device_group_close(struct vfio_device_file *df);
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index b3b7e2436aec..6739203873a6 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -423,16 +423,20 @@ static int vfio_device_first_open(struct vfio_device_file *df)
 {
 	struct vfio_device *device = df->device;
 	struct iommufd_ctx *iommufd = df->iommufd;
-	int ret;
+	int ret = 0;
 
 	lockdep_assert_held(&device->dev_set->lock);
 
 	if (!try_module_get(device->dev->driver->owner))
 		return -ENODEV;
 
+	/*
+	 * if neither iommufd nor container is used the device is in
+	 * noiommu mode then just go ahead to open it.
+	 */
 	if (iommufd)
 		ret = vfio_iommufd_bind(device, iommufd);
-	else
+	else if (vfio_device_group_uses_container(df))
 		ret = vfio_device_group_use_iommu(device);
 	if (ret)
 		goto err_module_put;
@@ -447,7 +451,7 @@ static int vfio_device_first_open(struct vfio_device_file *df)
 err_unuse_iommu:
 	if (iommufd)
 		vfio_iommufd_unbind(device);
-	else
+	else if (vfio_device_group_uses_container(df))
 		vfio_device_group_unuse_iommu(device);
 err_module_put:
 	module_put(device->dev->driver->owner);
@@ -465,7 +469,7 @@ static void vfio_device_last_close(struct vfio_device_file *df)
 		device->ops->close_device(device);
 	if (iommufd)
 		vfio_iommufd_unbind(device);
-	else
+	else if (vfio_device_group_uses_container(df))
 		vfio_device_group_unuse_iommu(device);
 	module_put(device->dev->driver->owner);
 }
-- 
2.34.1


  parent reply	other threads:[~2023-03-27  9:41 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-27  9:40 [PATCH v8 00/24] Add vfio_device cdev for iommufd support Yi Liu
2023-03-27  9:40 ` [PATCH v8 01/24] vfio: Allocate per device file structure Yi Liu
2023-03-27  9:40 ` [PATCH v8 02/24] vfio: Refine vfio file kAPIs for KVM Yi Liu
2023-03-27  9:40 ` [PATCH v8 03/24] vfio: Remove vfio_file_is_group() Yi Liu
2023-03-30 23:50   ` Jason Gunthorpe
2023-03-27  9:40 ` [PATCH v8 04/24] vfio: Accept vfio device file in the KVM facing kAPI Yi Liu
2023-03-27  9:40 ` [PATCH v8 05/24] kvm/vfio: Rename kvm_vfio_group to prepare for accepting vfio device fd Yi Liu
2023-03-27  9:40 ` [PATCH v8 06/24] kvm/vfio: Accept vfio device file from userspace Yi Liu
2023-03-27  9:40 ` [PATCH v8 07/24] vfio: Pass struct vfio_device_file * to vfio_device_open/close() Yi Liu
2023-03-27  9:40 ` [PATCH v8 08/24] vfio: Block device access via device fd until device is opened Yi Liu
2023-03-28 21:33   ` Alex Williamson
2023-03-29  2:23     ` Liu, Yi L
2023-03-27  9:40 ` [PATCH v8 09/24] vfio: Add cdev_device_open_cnt to vfio_group Yi Liu
2023-03-27  9:40 ` [PATCH v8 10/24] vfio: Make vfio_device_open() single open for device cdev path Yi Liu
2023-03-30 23:52   ` Jason Gunthorpe
2023-03-27  9:40 ` Yi Liu [this message]
2023-03-30 23:56   ` [PATCH v8 11/24] vfio: Make vfio_device_first_open() to accept NULL iommufd for noiommu Jason Gunthorpe
2023-03-27  9:40 ` [PATCH v8 12/24] vfio-iommufd: Move noiommu support out of vfio_iommufd_bind() Yi Liu
2023-03-27  9:40 ` [PATCH v8 13/24] vfio-iommufd: Split bind/attach into two steps Yi Liu
2023-03-27  9:40 ` [PATCH v8 14/24] vfio: Record devid in vfio_device_file Yi Liu
2023-03-27  9:40 ` [PATCH v8 15/24] vfio-iommufd: Add detach_ioas support for physical VFIO devices Yi Liu
2023-03-27  9:40 ` [PATCH v8 16/24] iommufd/device: Add iommufd_access_detach() API Yi Liu
2023-03-28  2:23   ` Jon Pan-Doh
2023-03-28 15:54     ` Nicolin Chen
2023-03-29  2:24       ` Liu, Yi L
2023-03-27  9:40 ` [PATCH v8 17/24] vfio-iommufd: Add detach_ioas support for emulated VFIO devices Yi Liu
2023-03-27  9:40 ` [PATCH v8 18/24] vfio: Determine noiommu in vfio_device registration Yi Liu
2023-03-28  6:36   ` Tian, Kevin
2023-03-27  9:40 ` [PATCH v8 19/24] vfio: Name noiommu vfio_device with "noiommu-" prefix Yi Liu
2023-03-28  6:37   ` Tian, Kevin
2023-03-27  9:40 ` [PATCH v8 20/24] vfio: Add cdev for vfio_device Yi Liu
2023-03-29 19:57   ` Alex Williamson
2023-03-30  5:35     ` Liu, Yi L
2023-03-27  9:40 ` [PATCH v8 21/24] vfio: Add VFIO_DEVICE_BIND_IOMMUFD Yi Liu
2023-03-29 21:00   ` Alex Williamson
2023-03-29 23:22     ` Jason Gunthorpe
2023-03-30 12:52       ` Liu, Yi L
2023-03-30 12:59         ` Jason Gunthorpe
2023-03-30  7:09     ` Liu, Yi L
2023-03-30 11:52       ` Jason Gunthorpe
2023-03-30 12:53         ` Liu, Yi L
2023-03-27  9:40 ` [PATCH v8 22/24] vfio: Add VFIO_DEVICE_AT[DE]TACH_IOMMUFD_PT Yi Liu
2023-03-29 21:19   ` Alex Williamson
2023-03-30 13:02     ` Liu, Yi L
2023-03-27  9:40 ` [PATCH v8 23/24] vfio: Compile group optionally Yi Liu
2023-03-29 21:51   ` Alex Williamson
2023-03-30 13:06     ` Liu, Yi L
2023-03-27  9:40 ` [PATCH v8 24/24] docs: vfio: Add vfio device cdev description Yi Liu
2023-03-29 22:47   ` Alex Williamson
2023-03-29 22:57     ` Alex Williamson
2023-03-30 13:11     ` Liu, Yi L
2023-03-27 17:48 ` [PATCH v8 00/24] Add vfio_device cdev for iommufd support Nicolin Chen
2023-03-31  3:10 ` Jiang, Yanting
2023-03-31  5:01 ` Jiang, Yanting

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=20230327094047.47215-12-yi.l.liu@intel.com \
    --to=yi.l.liu@intel.com \
    --cc=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.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;
as well as URLs for NNTP newsgroup(s).