Linux IOMMU Development
 help / color / mirror / Atom feed
From: Yi Liu <yi.l.liu@intel.com>
To: kevin.tian@intel.com, jgg@nvidia.com
Cc: joro@8bytes.org, baolu.lu@linux.intel.com, yi.l.liu@intel.com,
	iommu@lists.linux.dev, nicolinc@nvidia.com
Subject: [PATCH v10 10/18] iommufd: Enforce PASID-compatible domain in PASID path
Date: Thu, 20 Mar 2025 06:47:36 -0700	[thread overview]
Message-ID: <20250320134744.5777-11-yi.l.liu@intel.com> (raw)
In-Reply-To: <20250320134744.5777-1-yi.l.liu@intel.com>

AMD IOMMU requires attaching PASID-compatible domains to PASID-capable
devices. This includes the domains attached to RID and PASIDs. Related
discussions in link [1] and [2]. ARM also has such a requirement, Intel
does not need it, but can live up with it. Hence, iommufd is going to
enforce this requirement as it is not harmful to vendors that do not
need it.

Mark the PASID-compatible domains and enforce it in the PASID path.

[1] https://lore.kernel.org/linux-iommu/20240709182303.GK14050@ziepe.ca/
[2] https://lore.kernel.org/linux-iommu/20240822124433.GD3468552@ziepe.ca/

Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
 drivers/iommu/iommufd/device.c          | 17 +++++++++++++++++
 drivers/iommu/iommufd/hw_pagetable.c    |  3 +++
 drivers/iommu/iommufd/iommufd_private.h |  1 +
 3 files changed, 21 insertions(+)

diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
index 370aed636e8d..6d003f9f0668 100644
--- a/drivers/iommu/iommufd/device.c
+++ b/drivers/iommu/iommufd/device.c
@@ -510,6 +510,15 @@ static bool iommufd_device_is_attached(struct iommufd_device *idev,
 	return xa_load(&attach->device_array, idev->obj.id);
 }
 
+static int iommufd_hwpt_pasid_compat(struct iommufd_hw_pagetable *hwpt,
+				     struct iommufd_device *idev,
+				     ioasid_t pasid)
+{
+	if (pasid != IOMMU_NO_PASID && !hwpt->pasid_compat)
+		return -EINVAL;
+	return 0;
+}
+
 static int iommufd_hwpt_attach_device(struct iommufd_hw_pagetable *hwpt,
 				      struct iommufd_device *idev,
 				      ioasid_t pasid)
@@ -519,6 +528,10 @@ static int iommufd_hwpt_attach_device(struct iommufd_hw_pagetable *hwpt,
 
 	lockdep_assert_held(&idev->igroup->lock);
 
+	rc = iommufd_hwpt_pasid_compat(hwpt, idev, pasid);
+	if (rc)
+		return rc;
+
 	handle = kzalloc(sizeof(*handle), GFP_KERNEL);
 	if (!handle)
 		return -ENOMEM;
@@ -587,6 +600,10 @@ static int iommufd_hwpt_replace_device(struct iommufd_device *idev,
 
 	WARN_ON(pasid != IOMMU_NO_PASID);
 
+	rc = iommufd_hwpt_pasid_compat(hwpt, idev, pasid);
+	if (rc)
+		return rc;
+
 	old_handle = iommufd_device_get_attach_handle(idev, pasid);
 
 	handle = kzalloc(sizeof(*handle), GFP_KERNEL);
diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c
index 9bf970b6a1c3..b8c1e5ca7be8 100644
--- a/drivers/iommu/iommufd/hw_pagetable.c
+++ b/drivers/iommu/iommufd/hw_pagetable.c
@@ -136,6 +136,7 @@ iommufd_hwpt_paging_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas,
 	if (IS_ERR(hwpt_paging))
 		return ERR_CAST(hwpt_paging);
 	hwpt = &hwpt_paging->common;
+	hwpt->pasid_compat = flags & IOMMU_HWPT_ALLOC_PASID;
 
 	INIT_LIST_HEAD(&hwpt_paging->hwpt_item);
 	/* Pairs with iommufd_hw_pagetable_destroy() */
@@ -244,6 +245,7 @@ iommufd_hwpt_nested_alloc(struct iommufd_ctx *ictx,
 	if (IS_ERR(hwpt_nested))
 		return ERR_CAST(hwpt_nested);
 	hwpt = &hwpt_nested->common;
+	hwpt->pasid_compat = flags & IOMMU_HWPT_ALLOC_PASID;
 
 	refcount_inc(&parent->common.obj.users);
 	hwpt_nested->parent = parent;
@@ -300,6 +302,7 @@ iommufd_viommu_alloc_hwpt_nested(struct iommufd_viommu *viommu, u32 flags,
 	if (IS_ERR(hwpt_nested))
 		return ERR_CAST(hwpt_nested);
 	hwpt = &hwpt_nested->common;
+	hwpt->pasid_compat = flags & IOMMU_HWPT_ALLOC_PASID;
 
 	hwpt_nested->viommu = viommu;
 	refcount_inc(&viommu->obj.users);
diff --git a/drivers/iommu/iommufd/iommufd_private.h b/drivers/iommu/iommufd/iommufd_private.h
index 03a231f8f5bf..84c89f594ed0 100644
--- a/drivers/iommu/iommufd/iommufd_private.h
+++ b/drivers/iommu/iommufd/iommufd_private.h
@@ -296,6 +296,7 @@ struct iommufd_hw_pagetable {
 	struct iommufd_object obj;
 	struct iommu_domain *domain;
 	struct iommufd_fault *fault;
+	bool pasid_compat : 1;
 };
 
 struct iommufd_hwpt_paging {
-- 
2.34.1


  parent reply	other threads:[~2025-03-20 13:47 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-20 13:47 [PATCH v10 00/18] iommufd support pasid attach/replace Yi Liu
2025-03-20 13:47 ` [PATCH v10 01/18] iommu: Require passing new handles to APIs supporting handle Yi Liu
2025-03-20 15:23   ` Jason Gunthorpe
2025-03-20 23:51     ` Yi Liu
2025-03-21  2:35   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 02/18] iommu: Introduce a replace API for device pasid Yi Liu
2025-03-20 17:24   ` Nicolin Chen
2025-03-20 23:58     ` Yi Liu
2025-03-21  0:14       ` Yi Liu
2025-03-21  3:21       ` Nicolin Chen
2025-03-21  4:06         ` Yi Liu
2025-03-21  3:08   ` Baolu Lu
2025-03-21  4:19     ` Yi Liu
2025-03-20 13:47 ` [PATCH v10 03/18] iommufd: Pass @pasid through the device attach/replace path Yi Liu
2025-03-21  3:13   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 04/18] iommufd/device: Only add reserved_iova in non-pasid path Yi Liu
2025-03-21  3:14   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 05/18] iommufd/device: Replace idev->igroup with local variable Yi Liu
2025-03-21  3:14   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 06/18] iommufd/device: Add helper to detect the first attach of a group Yi Liu
2025-03-20 15:36   ` Jason Gunthorpe
2025-03-20 17:36   ` Nicolin Chen
2025-03-20 17:51     ` Nicolin Chen
2025-03-21  0:02       ` Yi Liu
2025-03-20 18:04     ` Jason Gunthorpe
2025-03-20 18:24       ` Nicolin Chen
2025-03-21  3:18   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 07/18] iommufd/device: Wrap igroup->hwpt and igroup->device_list into attach struct Yi Liu
2025-03-20 15:48   ` Jason Gunthorpe
2025-03-20 18:03   ` Nicolin Chen
2025-03-21  3:22   ` Baolu Lu
2025-03-20 13:47 ` [PATCH v10 08/18] iommufd/device: Replace device_list with device_array Yi Liu
2025-03-20 17:20   ` Jason Gunthorpe
2025-03-21  0:25     ` Yi Liu
2025-03-20 18:38   ` Nicolin Chen
2025-03-21  0:30     ` Yi Liu
2025-03-21  3:25       ` Nicolin Chen
2025-03-20 13:47 ` [PATCH v10 09/18] iommufd/device: Add pasid_attach array to track per-PASID attach Yi Liu
2025-03-20 17:33   ` Jason Gunthorpe
2025-03-20 19:19   ` Nicolin Chen
2025-03-20 19:29     ` Jason Gunthorpe
2025-03-20 20:13       ` Nicolin Chen
2025-03-21  0:15     ` Yi Liu
2025-03-20 13:47 ` Yi Liu [this message]
2025-03-20 13:47 ` [PATCH v10 11/18] iommufd: Support pasid attach/replace Yi Liu
2025-03-20 20:42   ` Nicolin Chen
2025-03-20 23:29     ` Jason Gunthorpe
2025-03-21  0:31     ` Yi Liu
2025-03-21  0:35       ` Nicolin Chen
2025-03-21  1:05         ` Yi Liu
2025-03-21 11:45           ` Jason Gunthorpe
2025-03-20 13:47 ` [PATCH v10 12/18] iommufd: Enforce PASID-compatible domain for RID Yi Liu
2025-03-20 17:35   ` Jason Gunthorpe
2025-03-20 22:23   ` Nicolin Chen
2025-03-20 23:31     ` Jason Gunthorpe
2025-03-21  0:45       ` Yi Liu
2025-03-21  0:41     ` Yi Liu
2025-03-20 13:47 ` [PATCH v10 13/18] iommu/vt-d: Add IOMMU_HWPT_ALLOC_PASID support Yi Liu
2025-03-20 13:47 ` [PATCH v10 14/18] iommufd: Allow allocating PASID-compatible domain Yi Liu
2025-03-20 17:51   ` Jason Gunthorpe
2025-03-21  0:52     ` Yi Liu
2025-03-20 22:36   ` Nicolin Chen
2025-03-20 13:47 ` [PATCH v10 15/18] iommufd/selftest: Add set_dev_pasid in mock iommu Yi Liu
2025-03-20 22:48   ` Nicolin Chen
2025-03-20 13:47 ` [PATCH v10 16/18] iommufd/selftest: Add a helper to get test device Yi Liu
2025-03-20 13:47 ` [PATCH v10 17/18] iommufd/selftest: Add test ops to test pasid attach/detach Yi Liu
2025-03-20 23:17   ` Nicolin Chen
2025-03-20 23:33     ` Jason Gunthorpe
2025-03-20 23:42     ` Nicolin Chen
2025-03-21  1:43     ` Yi Liu
2025-03-21 17:25       ` Nicolin Chen
2025-03-20 23:20   ` Nicolin Chen
2025-03-21  1:20     ` Yi Liu
2025-03-20 13:47 ` [PATCH v10 18/18] iommufd/selftest: Add coverage for iommufd " Yi Liu
2025-03-21  0:34   ` Nicolin Chen
2025-03-21 15:26     ` Yi Liu
2025-03-21 17:10       ` Nicolin Chen
2025-03-20 13:59 ` [PATCH v10 00/18] iommufd support pasid attach/replace 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=20250320134744.5777-11-yi.l.liu@intel.com \
    --to=yi.l.liu@intel.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=iommu@lists.linux.dev \
    --cc=jgg@nvidia.com \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=nicolinc@nvidia.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