]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/arm-smmu-v3: Remove arm_smmu_domain_finalise() during attach
authorJason Gunthorpe <jgg@nvidia.com>
Thu, 5 Dec 2024 15:43:27 +0000 (11:43 -0400)
committerWill Deacon <will@kernel.org>
Mon, 9 Dec 2024 23:08:06 +0000 (23:08 +0000)
Domains are now always finalized during allocation because the core code
no longer permits a NULL dev argument to domain_alloc_paging/_flags().

Remove the late finalize during attach that supported domains that were
not fully initialized.

Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/1-v1-0bb8d5313a27+27b-smmuv3_paging_flags_jgg@nvidia.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h

index d8ebe18a55077301ff1e50d6fee4c2198f49cec3..dc5fab268f7d72b304e20b78a779700b25273a47 100644 (file)
@@ -2460,7 +2460,6 @@ struct arm_smmu_domain *arm_smmu_domain_alloc(void)
        if (!smmu_domain)
                return ERR_PTR(-ENOMEM);
 
-       mutex_init(&smmu_domain->init_mutex);
        INIT_LIST_HEAD(&smmu_domain->devices);
        spin_lock_init(&smmu_domain->devices_lock);
 
@@ -2469,7 +2468,9 @@ struct arm_smmu_domain *arm_smmu_domain_alloc(void)
 
 static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev)
 {
+       struct arm_smmu_master *master = dev_iommu_priv_get(dev);
        struct arm_smmu_domain *smmu_domain;
+       int ret;
 
        /*
         * Allocate the domain and initialise some of its data structures.
@@ -2480,15 +2481,10 @@ static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev)
        if (IS_ERR(smmu_domain))
                return ERR_CAST(smmu_domain);
 
-       if (dev) {
-               struct arm_smmu_master *master = dev_iommu_priv_get(dev);
-               int ret;
-
-               ret = arm_smmu_domain_finalise(smmu_domain, master->smmu, 0);
-               if (ret) {
-                       kfree(smmu_domain);
-                       return ERR_PTR(ret);
-               }
+       ret = arm_smmu_domain_finalise(smmu_domain, master->smmu, 0);
+       if (ret) {
+               kfree(smmu_domain);
+               return ERR_PTR(ret);
        }
        return &smmu_domain->domain;
 }
@@ -2965,15 +2961,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
        state.master = master = dev_iommu_priv_get(dev);
        smmu = master->smmu;
 
-       mutex_lock(&smmu_domain->init_mutex);
-
-       if (!smmu_domain->smmu) {
-               ret = arm_smmu_domain_finalise(smmu_domain, smmu, 0);
-       } else if (smmu_domain->smmu != smmu)
-               ret = -EINVAL;
-
-       mutex_unlock(&smmu_domain->init_mutex);
-       if (ret)
+       if (smmu_domain->smmu != smmu)
                return ret;
 
        if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) {
@@ -3030,16 +3018,9 @@ static int arm_smmu_s1_set_dev_pasid(struct iommu_domain *domain,
        struct arm_smmu_master *master = dev_iommu_priv_get(dev);
        struct arm_smmu_device *smmu = master->smmu;
        struct arm_smmu_cd target_cd;
-       int ret = 0;
 
-       mutex_lock(&smmu_domain->init_mutex);
-       if (!smmu_domain->smmu)
-               ret = arm_smmu_domain_finalise(smmu_domain, smmu, 0);
-       else if (smmu_domain->smmu != smmu)
-               ret = -EINVAL;
-       mutex_unlock(&smmu_domain->init_mutex);
-       if (ret)
-               return ret;
+       if (smmu_domain->smmu != smmu)
+               return -EINVAL;
 
        if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1)
                return -EINVAL;
index c7f37fd47768f2cdd7e4140d13adb0636e093b0a..bd9d7c85576a26d2763c1929f135f8308f776077 100644 (file)
@@ -843,7 +843,6 @@ enum arm_smmu_domain_stage {
 
 struct arm_smmu_domain {
        struct arm_smmu_device          *smmu;
-       struct mutex                    init_mutex; /* Protects smmu pointer */
 
        struct io_pgtable_ops           *pgtbl_ops;
        atomic_t                        nr_ats_masters;