diff mbox series

[v1,2/3] iommu/arm-smmu-v3-sva: Remove bond refcount

Message ID 20230905194849.v1.2.Id3ab7cf665bcead097654937233a645722a4cce3@changeid (mailing list archive)
State New, archived
Headers show
Series Clean-up arm-smmu-v3-sva.c: remove arm_smmu_bond | expand

Commit Message

Michael Shavit Sept. 5, 2023, 11:49 a.m. UTC
Always allocate a new arm_smmu_bond in __arm_smmu_sva_bind and remove
the bond refcount since arm_smmu_bond can never be shared across calls
to __arm_smmu_sva_bind.

The iommu framework will not allocate multiple SVA domains for the same
(device/mm) pair, nor will it call set_dev_pasid for a device if a
domain is already attached on the given pasid. There's also a one-to-one
mapping between MM and PASID. __arm_smmu_sva_bind is therefore never
called with the same (device/mm) pair, and so there's no reason to try
and normalize allocations of the arm_smmu_bond struct for a (device/mm)
pair across set_dev_pasid.

Signed-off-by: Michael Shavit <mshavit@google.com>
---
Note that this is true today because iommu_sva_bind_device calls
iommu_get_domain_for_dev_pasid to elude the iommu_attach_device_pasid if
a domain is already attached.
But even with Tina's patch series where iommu_get_domain_for_dev_pasid
is no longer used, iommu_attach_device_pasid also checks whether a
domain is already attached in the group's pasid_array.

 drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

Comments

Jason Gunthorpe Sept. 5, 2023, 12:38 p.m. UTC | #1
On Tue, Sep 05, 2023 at 07:49:13PM +0800, Michael Shavit wrote:
> Always allocate a new arm_smmu_bond in __arm_smmu_sva_bind and remove
> the bond refcount since arm_smmu_bond can never be shared across calls
> to __arm_smmu_sva_bind.
> 
> The iommu framework will not allocate multiple SVA domains for the same
> (device/mm) pair, nor will it call set_dev_pasid for a device if a
> domain is already attached on the given pasid. There's also a one-to-one
> mapping between MM and PASID. __arm_smmu_sva_bind is therefore never
> called with the same (device/mm) pair, and so there's no reason to try
> and normalize allocations of the arm_smmu_bond struct for a (device/mm)
> pair across set_dev_pasid.
> 
> Signed-off-by: Michael Shavit <mshavit@google.com>
> ---
> Note that this is true today because iommu_sva_bind_device calls
> iommu_get_domain_for_dev_pasid to elude the iommu_attach_device_pasid if
> a domain is already attached.
> But even with Tina's patch series where iommu_get_domain_for_dev_pasid
> is no longer used, iommu_attach_device_pasid also checks whether a
> domain is already attached in the group's pasid_array.
> 
>  drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 12 +-----------
>  1 file changed, 1 insertion(+), 11 deletions(-)

Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>

Jason
diff mbox series

Patch

diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
index 32784758ccce6..9fb6907c5e7d4 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
@@ -28,7 +28,6 @@  struct arm_smmu_bond {
 	struct mm_struct		*mm;
 	struct arm_smmu_mmu_notifier	*smmu_mn;
 	struct list_head		list;
-	refcount_t			refs;
 };
 
 #define sva_to_bond(handle) \
@@ -330,20 +329,11 @@  static int __arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm)
 	if (!master || !master->sva_enabled)
 		return -ENODEV;
 
-	/* If bind() was already called for this {dev, mm} pair, reuse it. */
-	list_for_each_entry(bond, &master->bonds, list) {
-		if (bond->mm == mm) {
-			refcount_inc(&bond->refs);
-			return &bond->sva;
-		}
-	}
-
 	bond = kzalloc(sizeof(*bond), GFP_KERNEL);
 	if (!bond)
 		return -ENOMEM;
 
 	bond->mm = mm;
-	refcount_set(&bond->refs, 1);
 
 	bond->smmu_mn = arm_smmu_mmu_notifier_get(smmu_domain, mm);
 	if (IS_ERR(bond->smmu_mn)) {
@@ -522,7 +512,7 @@  void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain,
 		}
 	}
 
-	if (!WARN_ON(!bond) && refcount_dec_and_test(&bond->refs)) {
+	if (!WARN_ON(!bond)) {
 		list_del(&bond->list);
 		arm_smmu_mmu_notifier_put(bond->smmu_mn);
 		kfree(bond);