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 v9 08/21] iommufd/device: Lift iommufd_attach_handle handling to upper level helpers
Date: Thu, 13 Mar 2025 05:35:19 -0700 [thread overview]
Message-ID: <20250313123532.103522-9-yi.l.liu@intel.com> (raw)
In-Reply-To: <20250313123532.103522-1-yi.l.liu@intel.com>
iommufd_attach_handle is allocated when attaching the first device of a
group, and destroyed when the last device is detached. The life circle is
aligned with the igroup->hwpt which is used to track attached hwpt of the
group.
This lifts the handle allocation/destroy to the upper level helpers. It
prepares for using the handle to track hwpt attachment.
No functional change is expected, except for that the replace path reuses
the old handle instead of allocating a new one. This is needed when using
handle to track attached devices of a group. Otherwise, the replace path
would need to move the tracked devices to the new handle.
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
---
drivers/iommu/iommufd/device.c | 66 +++++++++++++++++-----------------
1 file changed, 33 insertions(+), 33 deletions(-)
diff --git a/drivers/iommu/iommufd/device.c b/drivers/iommu/iommufd/device.c
index a63d90ab3154..e1f27da65720 100644
--- a/drivers/iommu/iommufd/device.c
+++ b/drivers/iommu/iommufd/device.c
@@ -485,24 +485,19 @@ static bool iommufd_device_is_attached(struct iommufd_device *idev)
static int iommufd_hwpt_attach_device(struct iommufd_hw_pagetable *hwpt,
struct iommufd_device *idev,
- ioasid_t pasid)
+ ioasid_t pasid,
+ struct iommufd_attach_handle *handle)
{
- struct iommufd_attach_handle *handle;
int rc;
lockdep_assert_held(&idev->igroup->lock);
- handle = kzalloc(sizeof(*handle), GFP_KERNEL);
- if (!handle)
- return -ENOMEM;
-
if (hwpt->fault) {
rc = iommufd_fault_iopf_enable(idev);
if (rc)
- goto out_free_handle;
+ return rc;
}
- handle->idev = idev;
WARN_ON(pasid != IOMMU_NO_PASID);
rc = iommu_attach_group_handle(hwpt->domain, idev->igroup->group,
&handle->handle);
@@ -514,8 +509,6 @@ static int iommufd_hwpt_attach_device(struct iommufd_hw_pagetable *hwpt,
out_disable_iopf:
if (hwpt->fault)
iommufd_fault_iopf_disable(idev);
-out_free_handle:
- kfree(handle);
return rc;
}
@@ -535,63 +528,50 @@ iommufd_device_get_attach_handle(struct iommufd_device *idev, ioasid_t pasid)
static void iommufd_hwpt_detach_device(struct iommufd_hw_pagetable *hwpt,
struct iommufd_device *idev,
- ioasid_t pasid)
+ ioasid_t pasid,
+ struct iommufd_attach_handle *handle)
{
- struct iommufd_attach_handle *handle;
-
WARN_ON(pasid != IOMMU_NO_PASID);
- handle = iommufd_device_get_attach_handle(idev, pasid);
iommu_detach_group_handle(hwpt->domain, idev->igroup->group);
if (hwpt->fault) {
iommufd_auto_response_faults(hwpt, handle);
iommufd_fault_iopf_disable(idev);
}
- kfree(handle);
}
static int iommufd_hwpt_replace_device(struct iommufd_device *idev,
ioasid_t pasid,
struct iommufd_hw_pagetable *hwpt,
- struct iommufd_hw_pagetable *old)
+ struct iommufd_hw_pagetable *old,
+ struct iommufd_attach_handle *handle)
{
- struct iommufd_attach_handle *handle, *old_handle;
int rc;
WARN_ON(pasid != IOMMU_NO_PASID);
- old_handle = iommufd_device_get_attach_handle(idev, pasid);
-
- handle = kzalloc(sizeof(*handle), GFP_KERNEL);
- if (!handle)
- return -ENOMEM;
-
if (hwpt->fault && !old->fault) {
rc = iommufd_fault_iopf_enable(idev);
if (rc)
- goto out_free_handle;
+ return rc;
}
- handle->idev = idev;
rc = iommu_replace_group_handle(idev->igroup->group, hwpt->domain,
&handle->handle);
if (rc)
goto out_disable_iopf;
if (old->fault) {
- iommufd_auto_response_faults(hwpt, old_handle);
+ iommufd_auto_response_faults(hwpt, handle);
if (!hwpt->fault)
iommufd_fault_iopf_disable(idev);
}
- kfree(old_handle);
return 0;
out_disable_iopf:
if (hwpt->fault && !old->fault)
iommufd_fault_iopf_disable(idev);
-out_free_handle:
- kfree(handle);
return rc;
}
@@ -601,6 +581,7 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
struct iommufd_hwpt_paging *hwpt_paging = find_hwpt_paging(hwpt);
bool attach_resv = hwpt_paging && pasid == IOMMU_NO_PASID;
struct iommufd_group *igroup = idev->igroup;
+ struct iommufd_attach_handle *handle;
int rc;
mutex_lock(&igroup->lock);
@@ -610,10 +591,19 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
goto err_unlock;
}
+ if (!igroup->hwpt) {
+ handle = kzalloc(sizeof(*handle), GFP_KERNEL);
+ if (!handle) {
+ rc = -ENOMEM;
+ goto err_unlock;
+ }
+ handle->idev = idev;
+ }
+
if (attach_resv) {
rc = iommufd_device_attach_reserved_iova(idev, hwpt_paging);
if (rc)
- goto err_unlock;
+ goto err_free_handle;
}
/*
@@ -624,7 +614,7 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
* attachment.
*/
if (list_empty(&igroup->device_list)) {
- rc = iommufd_hwpt_attach_device(hwpt, idev, pasid);
+ rc = iommufd_hwpt_attach_device(hwpt, idev, pasid, handle);
if (rc)
goto err_unresv;
igroup->hwpt = hwpt;
@@ -636,6 +626,9 @@ int iommufd_hw_pagetable_attach(struct iommufd_hw_pagetable *hwpt,
err_unresv:
if (attach_resv)
iopt_remove_reserved_iova(&hwpt_paging->ioas->iopt, idev->dev);
+err_free_handle:
+ if (!igroup->hwpt)
+ kfree(handle);
err_unlock:
mutex_unlock(&igroup->lock);
return rc;
@@ -647,12 +640,15 @@ iommufd_hw_pagetable_detach(struct iommufd_device *idev, ioasid_t pasid)
struct iommufd_group *igroup = idev->igroup;
struct iommufd_hw_pagetable *hwpt = igroup->hwpt;
struct iommufd_hwpt_paging *hwpt_paging = find_hwpt_paging(hwpt);
+ struct iommufd_attach_handle *handle;
mutex_lock(&igroup->lock);
list_del(&idev->group_item);
if (list_empty(&igroup->device_list)) {
- iommufd_hwpt_detach_device(hwpt, idev, pasid);
+ handle = iommufd_device_get_attach_handle(idev, pasid);
+ iommufd_hwpt_detach_device(hwpt, idev, pasid, handle);
igroup->hwpt = NULL;
+ kfree(handle);
}
if (hwpt_paging && pasid == IOMMU_NO_PASID)
iopt_remove_reserved_iova(&hwpt_paging->ioas->iopt, idev->dev);
@@ -725,6 +721,7 @@ iommufd_device_do_replace(struct iommufd_device *idev, ioasid_t pasid,
struct iommufd_hwpt_paging *old_hwpt_paging;
struct iommufd_group *igroup = idev->igroup;
struct iommufd_hw_pagetable *old_hwpt;
+ struct iommufd_attach_handle *handle;
unsigned int num_devices;
int rc;
@@ -745,6 +742,9 @@ iommufd_device_do_replace(struct iommufd_device *idev, ioasid_t pasid,
return NULL;
}
+ handle = iommufd_device_get_attach_handle(idev, pasid);
+ WARN_ON(!handle);
+
old_hwpt = igroup->hwpt;
if (attach_resv) {
rc = iommufd_group_do_replace_reserved_iova(igroup, hwpt_paging);
@@ -752,7 +752,7 @@ iommufd_device_do_replace(struct iommufd_device *idev, ioasid_t pasid,
goto err_unlock;
}
- rc = iommufd_hwpt_replace_device(idev, pasid, hwpt, old_hwpt);
+ rc = iommufd_hwpt_replace_device(idev, pasid, hwpt, old_hwpt, handle);
if (rc)
goto err_unresv;
--
2.34.1
next prev parent reply other threads:[~2025-03-13 12:35 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-13 12:35 [PATCH v9 00/21] iommufd support pasid attach/replace Yi Liu
2025-03-13 12:35 ` [PATCH v9 01/21] iommu: Clear handle->domain in detach Yi Liu
2025-03-18 11:46 ` Jason Gunthorpe
2025-03-18 13:30 ` Yi Liu
2025-03-13 12:35 ` [PATCH v9 02/21] iommu: Wrap pasid_array entry creation and setting Yi Liu
2025-03-18 12:04 ` Jason Gunthorpe
2025-03-18 14:40 ` Yi Liu
2025-03-13 12:35 ` [PATCH v9 03/21] iommu: Introduce a replace API for device pasid Yi Liu
2025-03-18 12:19 ` Jason Gunthorpe
2025-03-18 13:50 ` Baolu Lu
2025-03-18 13:57 ` Jason Gunthorpe
2025-03-13 12:35 ` [PATCH v9 04/21] iommufd: Pass @pasid through the device attach/replace path Yi Liu
2025-03-13 12:35 ` [PATCH v9 05/21] iommufd/device: Only add reserved_iova in non-pasid path Yi Liu
2025-03-18 19:22 ` Nicolin Chen
2025-03-13 12:35 ` [PATCH v9 06/21] iommufd/device: Replace idev->igroup with local variable Yi Liu
2025-03-18 12:25 ` Jason Gunthorpe
2025-03-18 19:24 ` Nicolin Chen
2025-03-13 12:35 ` [PATCH v9 07/21] iommufd/device: Check !igroup->hwpt in iommufd_device_attach_reserved_iova() Yi Liu
2025-03-18 12:27 ` Jason Gunthorpe
2025-03-13 12:35 ` Yi Liu [this message]
2025-03-18 12:30 ` [PATCH v9 08/21] iommufd/device: Lift iommufd_attach_handle handling to upper level helpers Jason Gunthorpe
2025-03-13 12:35 ` [PATCH v9 09/21] iommufd/device: Use iommufd_attach_handle track attachment Yi Liu
2025-03-13 12:35 ` [PATCH v9 10/21] iommufd/device: Replace device_list with device_array Yi Liu
2025-03-13 12:35 ` [PATCH v9 11/21] iommufd/device: Move attached device tracking to handle Yi Liu
2025-03-18 12:34 ` Jason Gunthorpe
2025-03-18 13:25 ` Yi Liu
2025-03-18 13:26 ` Jason Gunthorpe
2025-03-18 13:50 ` Yi Liu
2025-03-18 13:56 ` Jason Gunthorpe
2025-03-18 14:13 ` Yi Liu
2025-03-18 14:32 ` Jason Gunthorpe
2025-03-13 12:35 ` [PATCH v9 12/21] iommufd/device: Add pasid_attach array to track per-PASID attach Yi Liu
2025-03-17 7:07 ` Yi Liu
2025-03-13 12:35 ` [PATCH v9 13/21] iommufd: Enforce PASID-compatible domain in PASID path Yi Liu
2025-03-13 12:35 ` [PATCH v9 14/21] iommufd: Support pasid attach/replace Yi Liu
2025-03-18 12:35 ` Jason Gunthorpe
2025-03-13 12:35 ` [PATCH v9 15/21] iommufd: Enforce PASID-compatible domain for RID Yi Liu
2025-03-18 12:38 ` Jason Gunthorpe
2025-03-18 14:09 ` Yi Liu
2025-03-13 12:35 ` [PATCH v9 16/21] iommu/vt-d: Add IOMMU_HWPT_ALLOC_PASID support Yi Liu
2025-03-13 12:35 ` [PATCH v9 17/21] iommufd: Allow allocating PASID-compatible domain Yi Liu
2025-03-18 12:39 ` Jason Gunthorpe
2025-03-13 12:35 ` [PATCH v9 18/21] iommufd/selftest: Add set_dev_pasid in mock iommu Yi Liu
2025-03-13 12:35 ` [PATCH v9 19/21] iommufd/selftest: Add a helper to get test device Yi Liu
2025-03-13 12:35 ` [PATCH v9 20/21] iommufd/selftest: Add test ops to test pasid attach/detach Yi Liu
2025-03-13 12:35 ` [PATCH v9 21/21] iommufd/selftest: Add coverage for iommufd " Yi Liu
2025-03-18 12:41 ` [PATCH v9 00/21] iommufd support pasid attach/replace Jason Gunthorpe
2025-03-18 14:37 ` 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=20250313123532.103522-9-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