On 3/9/23 4:09 PM, Yi Liu wrote:
From: Nicolin Chen nicolinc@nvidia.com
A user-managed hw_pagetable does not need to get populated, since it is managed by a guest OS. Move the iopt_table_add_domain and list_add_tail calls into a helper, where the hwpt pointer will be redirected to its hwpt->parent if it's available.
Signed-off-by: Nicolin Chen nicolinc@nvidia.com Signed-off-by: Yi Liu yi.l.liu@intel.com
drivers/iommu/iommufd/hw_pagetable.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/iommufd/hw_pagetable.c b/drivers/iommu/iommufd/hw_pagetable.c index 16e92a1c150b..6e45ec0a66fa 100644 --- a/drivers/iommu/iommufd/hw_pagetable.c +++ b/drivers/iommu/iommufd/hw_pagetable.c @@ -43,6 +43,23 @@ int iommufd_hw_pagetable_enforce_cc(struct iommufd_hw_pagetable *hwpt) return 0; } +static int iommufd_hw_pagetable_link_ioas(struct iommufd_hw_pagetable *hwpt) +{
- int rc;
- if (hwpt->parent)
hwpt = hwpt->parent;
- if (!list_empty(&hwpt->hwpt_item))
return 0;
What is above check for? Is it "the hwpt has already been inserted into the hwpt list of its ioas in another place"?
If so, is it possible that hwpt will be deleted from the list even when this user hwpt is still linked to the ioas?
- rc = iopt_table_add_domain(&hwpt->ioas->iopt, hwpt->domain);
- if (rc)
return rc;
- list_add_tail(&hwpt->hwpt_item, &hwpt->ioas->hwpt_list);
- return 0;
+}
- /**
- iommufd_hw_pagetable_alloc() - Get an iommu_domain for a device
- @ictx: iommufd context
@@ -131,10 +148,9 @@ iommufd_hw_pagetable_alloc(struct iommufd_ctx *ictx, struct iommufd_ioas *ioas, goto out_unlock; }
- rc = iopt_table_add_domain(&hwpt->ioas->iopt, hwpt->domain);
- rc = iommufd_hw_pagetable_link_ioas(hwpt); if (rc) goto out_detach;
- list_add_tail(&hwpt->hwpt_item, &hwpt->ioas->hwpt_list);
mutex_unlock(&idev->igroup->lock); return hwpt;
Best regards, baolu