All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yi Liu <yi.l.liu@intel.com>
To: joro@8bytes.org, alex.williamson@redhat.com, jgg@nvidia.com,
	kevin.tian@intel.com, robin.murphy@arm.com,
	baolu.lu@linux.intel.com
Cc: 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, iommu@lists.linux.dev,
	linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
	zhenzhong.duan@intel.com, joao.m.martins@oracle.com
Subject: [PATCH v4 09/17] iommufd/device: Add helpers to enforce/remove device reserved regions
Date: Thu, 21 Sep 2023 00:51:30 -0700	[thread overview]
Message-ID: <20230921075138.124099-10-yi.l.liu@intel.com> (raw)
In-Reply-To: <20230921075138.124099-1-yi.l.liu@intel.com>

From: Nicolin Chen <nicolinc@nvidia.com>

The iopt_table_enforce_dev_resv_regions() and iopt_remove_reserved_iova()
require callers to pass in an ioas->iopt pointer. It simply works with a
kernel-managed hw_pagetable by passing in its hwpt->ioas->iopt pointer.
However, now there could be a user-managed hw_pagetable that doesn't have
an ioas pointer. And typically most of device reserved regions should be
enforced to a kernel-managed domain only, although the IOMMU_RESV_SW_MSI
used by SMMU will introduce some complication.

Add a pair of iommufd_device_enforce_rr/iommufd_device_remove_rr helpers
that calls iopt_table_enforce_dev_resv_regions/iopt_remove_reserved_iova
functions after some additional checks. This would also ease any further
extension to support the IOMMU_RESV_SW_MSI complication mentioned above.

For the replace() routine, add another helper to compare ioas pointers,
with the support of user-managed hw_pagetables.

Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
 drivers/iommu/iommufd/device.c          | 42 ++++++++++++++++++-------
 drivers/iommu/iommufd/iommufd_private.h | 18 +++++++++++
 2 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
index 104dd061a2a3..10e6ec590ede 100644
--- a/drivers/iommu/iommufd/device.c
+++ b/drivers/iommu/iommufd/device.c
@@ -329,6 +329,28 @@ static int iommufd_group_setup_msi(struct iommufd_group *igroup,
 	return 0;
 }
 
+static void iommufd_device_remove_rr(struct iommufd_device *idev,
+				     struct iommufd_hw_pagetable *hwpt)
+{
+	if (WARN_ON(!hwpt))
+		return;
+	if (hwpt->user_managed)
+		return;
+	iopt_remove_reserved_iova(&hwpt->ioas->iopt, idev->dev);
+}
+
+static int iommufd_device_enforce_rr(struct iommufd_device *idev,
+				     struct iommufd_hw_pagetable *hwpt,
+				     phys_addr_t *sw_msi_start)
+{
+	if (WARN_ON(!hwpt))
+		return -EINVAL;
+	if (hwpt->user_managed)
+		return 0;
+	return iopt_table_enforce_dev_resv_regions(&hwpt->ioas->iopt, idev->dev,
+						   sw_msi_start);
+}
+
 int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
 				struct iommufd_device *idev)
 {
@@ -348,8 +370,7 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
 			goto err_unlock;
 	}
 
-	rc = iopt_table_enforce_dev_resv_regions(&hwpt->ioas->iopt, idev->dev,
-						 &idev->igroup->sw_msi_start);
+	rc = iommufd_device_enforce_rr(idev, hwpt, &idev->igroup->sw_msi_start);
 	if (rc)
 		goto err_unlock;
 
@@ -375,7 +396,7 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
 	mutex_unlock(&idev->igroup->lock);
 	return 0;
 err_unresv:
-	iopt_remove_reserved_iova(&hwpt->ioas->iopt, idev->dev);
+	iommufd_device_remove_rr(idev, hwpt);
 err_unlock:
 	mutex_unlock(&idev->igroup->lock);
 	return rc;
@@ -392,7 +413,7 @@ iommufd_hw_pagetable_detach(struct iommufd_device *idev)
 		iommu_detach_group(hwpt->domain, idev->igroup->group);
 		idev->igroup->hwpt = NULL;
 	}
-	iopt_remove_reserved_iova(&hwpt->ioas->iopt, idev->dev);
+	iommufd_device_remove_rr(idev, hwpt);
 	mutex_unlock(&idev->igroup->lock);
 
 	/* Caller must destroy hwpt */
@@ -444,10 +465,9 @@ iommufd_device_do_replace(struct iommufd_device *idev,
 	}
 
 	old_hwpt = igroup->hwpt;
-	if (hwpt->ioas != old_hwpt->ioas) {
+	if (iommufd_hw_pagetable_compare_ioas(old_hwpt, hwpt)) {
 		list_for_each_entry(cur, &igroup->device_list, group_item) {
-			rc = iopt_table_enforce_dev_resv_regions(
-				&hwpt->ioas->iopt, cur->dev, NULL);
+			rc = iommufd_device_enforce_rr(cur, hwpt, NULL);
 			if (rc)
 				goto err_unresv;
 		}
@@ -461,12 +481,10 @@ iommufd_device_do_replace(struct iommufd_device *idev,
 	if (rc)
 		goto err_unresv;
 
-	if (hwpt->ioas != old_hwpt->ioas) {
+	if (iommufd_hw_pagetable_compare_ioas(old_hwpt, hwpt)) {
 		list_for_each_entry(cur, &igroup->device_list, group_item)
-			iopt_remove_reserved_iova(&old_hwpt->ioas->iopt,
-						  cur->dev);
+			iommufd_device_remove_rr(cur, hwpt);
 	}
-
 	igroup->hwpt = hwpt;
 
 	/*
@@ -483,7 +501,7 @@ iommufd_device_do_replace(struct iommufd_device *idev,
 	return old_hwpt;
 err_unresv:
 	list_for_each_entry(cur, &igroup->device_list, group_item)
-		iopt_remove_reserved_iova(&hwpt->ioas->iopt, cur->dev);
+		iommufd_device_remove_rr(cur, hwpt);
 err_unlock:
 	mutex_unlock(&idev->igroup->lock);
 	return ERR_PTR(rc);
diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommufd/iommufd_private.h
index 34940596c2c2..b14f23d3f42e 100644
--- a/drivers/iommu/iommufd/iommufd_private.h
+++ b/drivers/iommu/iommufd/iommufd_private.h
@@ -281,6 +281,24 @@ static inline void iommufd_hw_pagetable_put(struct iommufd_ctx *ictx,
 		refcount_dec(&hwpt->obj.users);
 }
 
+static inline bool
+iommufd_hw_pagetable_compare_ioas(struct iommufd_hw_pagetable *old_hwpt,
+				  struct iommufd_hw_pagetable *new_hwpt)
+{
+	struct iommufd_ioas *old_ioas, *new_ioas;
+
+	WARN_ON(!old_hwpt || !new_hwpt);
+	if (old_hwpt->user_managed)
+		old_ioas = old_hwpt->parent->ioas;
+	else
+		old_ioas = old_hwpt->ioas;
+	if (new_hwpt->user_managed)
+		new_ioas = new_hwpt->parent->ioas;
+	else
+		new_ioas = new_hwpt->ioas;
+	return old_ioas != new_ioas;
+}
+
 struct iommufd_group {
 	struct kref ref;
 	struct mutex lock;
-- 
2.34.1


  parent reply	other threads:[~2023-09-21 18:52 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-21  7:51 [PATCH v4 00/17] iommufd: Add nesting infrastructure Yi Liu
2023-09-21  7:51 ` [PATCH v4 01/17] iommu: Add hwpt_type with user_data for domain_alloc_user op Yi Liu
2023-09-21 12:10   ` Baolu Lu
2023-09-21 20:58     ` Nicolin Chen
2023-09-25 13:05       ` Jason Gunthorpe
2023-09-25 18:17         ` Nicolin Chen
2023-09-25  6:22     ` Yi Liu
2023-09-25  8:01       ` Baolu Lu
2023-09-25 13:00         ` Jason Gunthorpe
2023-09-21 12:12   ` Baolu Lu
2023-09-21 16:44     ` Jason Gunthorpe
2023-09-22  9:47       ` Robin Murphy
2023-09-25  6:17         ` Yi Liu
2023-09-25 12:59           ` Jason Gunthorpe
2023-09-26  6:37         ` Tian, Kevin
2023-09-26 16:29           ` Jason Gunthorpe
2023-09-27  1:08             ` Tian, Kevin
2023-10-07  9:38               ` Yi Liu
2023-09-26  6:56   ` Tian, Kevin
2023-10-12  9:12     ` Yi Liu
2023-10-13 11:42       ` Yi Liu
2023-10-13 22:22         ` Nicolin Chen
2023-10-10 16:58   ` Jason Gunthorpe
2023-10-12  9:11     ` Yi Liu
2023-10-12 13:39       ` Jason Gunthorpe
2023-10-13  4:33         ` Yi Liu
2023-10-13 14:04           ` Jason Gunthorpe
2023-10-13 17:56             ` Nicolin Chen
2023-10-16  3:28               ` Yi Liu
2023-10-16 11:54                 ` Jason Gunthorpe
2023-10-16 18:17                   ` Nicolin Chen
2023-10-17  8:51                     ` Yi Liu
2023-10-17  9:28                       ` Tian, Kevin
2023-10-18  6:12                         ` Yi Liu
2023-10-18 16:37                     ` Jason Gunthorpe
2023-10-18 16:51                       ` Nicolin Chen
2023-10-13  0:34     ` Nicolin Chen
2023-10-13 14:03       ` Jason Gunthorpe
2023-09-21  7:51 ` [PATCH v4 02/17] iommu: Add nested domain support Yi Liu
2023-10-10 17:21   ` Jason Gunthorpe
2023-10-12  9:13     ` Yi Liu
2023-10-14  0:47       ` Nicolin Chen
2023-09-21  7:51 ` [PATCH v4 03/17] iommufd: Unite all kernel-managed members into a struct Yi Liu
2023-09-26  7:46   ` Tian, Kevin
2023-10-07 10:08   ` Yan Zhao
2023-10-09  4:13     ` Yi Liu
2023-10-09  5:13       ` Yan Zhao
2023-10-10  3:26         ` Yi Liu
2023-09-21  7:51 ` [PATCH v4 04/17] iommufd: Pass in hwpt_type/user_data to iommufd_hw_pagetable_alloc() Yi Liu
2023-09-21  7:51 ` [PATCH v4 05/17] iommufd: Separate kernel-managed HWPT alloc/destroy/abort functions Yi Liu
2023-09-26  7:57   ` Tian, Kevin
2023-10-10 18:49   ` Jason Gunthorpe
2023-10-12 19:09     ` Jason Gunthorpe
2023-10-13  7:13       ` Tian, Kevin
2023-10-13 14:05         ` Jason Gunthorpe
2023-10-16  8:26           ` Tian, Kevin
2023-10-16 12:02             ` Jason Gunthorpe
2023-09-21  7:51 ` [PATCH v4 06/17] iommufd: Add shared alloc_fn function pointer and mutex pointer Yi Liu
2023-09-21  7:51 ` [PATCH v4 07/17] iommufd: Add user-managed hw_pagetable support Yi Liu
2023-09-26  8:14   ` Tian, Kevin
2023-10-14  0:08     ` Nicolin Chen
2023-09-21  7:51 ` [PATCH v4 08/17] iommufd: Always setup MSI and anforce cc on kernel-managed domains Yi Liu
2023-09-26  8:16   ` Tian, Kevin
2023-10-14  0:44     ` Nicolin Chen
2023-10-16  8:48       ` Tian, Kevin
2023-10-16 11:57         ` Jason Gunthorpe
2023-10-17  8:52           ` Tian, Kevin
2023-10-17 15:53             ` Jason Gunthorpe
2023-10-17 19:58               ` Nicolin Chen
2023-10-18 16:51                 ` Jason Gunthorpe
2023-10-19  1:56                   ` Tian, Kevin
2023-10-19 23:53                     ` Jason Gunthorpe
2023-10-20  2:43                       ` Tian, Kevin
2023-10-20 13:55                         ` Jason Gunthorpe
2023-10-20 18:59                           ` Nicolin Chen
2023-10-21 16:38                             ` Jason Gunthorpe
2023-10-23  0:18                               ` Nicolin Chen
2023-10-23  2:53                                 ` Tian, Kevin
2023-10-23 18:42                                   ` Nicolin Chen
2023-10-23 13:59                                 ` Jason Gunthorpe
2023-10-23 18:49                                   ` Nicolin Chen
2023-10-18  2:32             ` Baolu Lu
2023-10-17  9:05           ` Tian, Kevin
2023-09-21  7:51 ` Yi Liu [this message]
2023-10-07  7:20   ` [PATCH v4 09/17] iommufd/device: Add helpers to enforce/remove device reserved regions Yan Zhao
2023-10-07  9:27     ` Nicolin Chen
2023-09-21  7:51 ` [PATCH v4 10/17] iommufd: Support IOMMU_HWPT_ALLOC allocation with user data Yi Liu
2023-10-13 15:19   ` Jason Gunthorpe
2023-10-13 20:58     ` Nicolin Chen
2023-10-14  0:07       ` Jason Gunthorpe
2023-10-14  0:51         ` Nicolin Chen
2023-10-16  7:03           ` Yi Liu
2023-10-16 11:59             ` Jason Gunthorpe
2023-10-16 18:44               ` Nicolin Chen
2023-10-17  8:55                 ` Yi Liu
2023-10-17 15:50                   ` Jason Gunthorpe
2023-10-17 19:32                     ` Nicolin Chen
2023-09-21  7:51 ` [PATCH v4 11/17] iommufd: Add IOMMU_HWPT_INVALIDATE Yi Liu
2023-09-21  7:51 ` [PATCH v4 12/17] iommufd/selftest: Rework TEST_LENGTH to test min_size explicitly Yi Liu
2023-09-21  7:51 ` [PATCH v4 13/17] iommufd/selftest: Add nested domain allocation for mock domain Yi Liu
2023-09-21  7:51 ` [PATCH v4 14/17] iommufd/selftest: Add coverage for IOMMU_HWPT_ALLOC with nested HWPTs Yi Liu
2023-09-21  7:51 ` [PATCH v4 15/17] iommufd/selftest: Add mock_domain_cache_invalidate_user support Yi Liu
2023-09-21  7:51 ` [PATCH v4 16/17] iommufd/selftest: Add IOMMU_TEST_OP_MD_CHECK_IOTLB test op Yi Liu
2023-09-21  7:51 ` [PATCH v4 17/17] iommufd/selftest: Add coverage for IOMMU_HWPT_INVALIDATE ioctl Yi Liu
2023-10-10 16:53 ` [PATCH v4 00/17] iommufd: Add nesting infrastructure Jason Gunthorpe
2023-10-12  8:45   ` Yi Liu

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=20230921075138.124099-10-yi.l.liu@intel.com \
    --to=yi.l.liu@intel.com \
    --cc=alex.williamson@redhat.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=chao.p.peng@linux.intel.com \
    --cc=cohuck@redhat.com \
    --cc=eric.auger@redhat.com \
    --cc=iommu@lists.linux.dev \
    --cc=jasowang@redhat.com \
    --cc=jgg@nvidia.com \
    --cc=joao.m.martins@oracle.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@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=yi.y.sun@linux.intel.com \
    --cc=zhenzhong.duan@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.