]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/arm-smmu-v3: Do not use devm for the cd table allocations
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 6 Sep 2024 15:47:52 +0000 (12:47 -0300)
committerWill Deacon <will@kernel.org>
Mon, 9 Sep 2024 14:47:14 +0000 (15:47 +0100)
The master->cd_table is entirely contained within the struct
arm_smmu_master which is guaranteed to be freed by the core code under
arm_smmu_release_device().

There is no reason to use devm here, arm_smmu_free_cd_tables() is reliably
called to free the CD related memory. Remove it and save some memory.

Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/5-v4-6416877274e1+1af-smmuv3_tidy_jgg@nvidia.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

index bb6c556995a7a72ce38cd1dd4c6a3f747fa890ea..c69d50e39b21eb2109591b0fe25dea6063e4a881 100644 (file)
@@ -1222,8 +1222,8 @@ static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu,
 {
        size_t size = CTXDESC_L2_ENTRIES * (CTXDESC_CD_DWORDS << 3);
 
-       l1_desc->l2ptr = dmam_alloc_coherent(smmu->dev, size,
-                                            &l1_desc->l2ptr_dma, GFP_KERNEL);
+       l1_desc->l2ptr = dma_alloc_coherent(smmu->dev, size,
+                                           &l1_desc->l2ptr_dma, GFP_KERNEL);
        if (!l1_desc->l2ptr) {
                dev_warn(smmu->dev,
                         "failed to allocate context descriptor table\n");
@@ -1437,17 +1437,17 @@ static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master)
                cd_table->num_l1_ents = DIV_ROUND_UP(max_contexts,
                                                  CTXDESC_L2_ENTRIES);
 
-               cd_table->l1_desc = devm_kcalloc(smmu->dev, cd_table->num_l1_ents,
-                                             sizeof(*cd_table->l1_desc),
-                                             GFP_KERNEL);
+               cd_table->l1_desc = kcalloc(cd_table->num_l1_ents,
+                                           sizeof(*cd_table->l1_desc),
+                                           GFP_KERNEL);
                if (!cd_table->l1_desc)
                        return -ENOMEM;
 
                l1size = cd_table->num_l1_ents * (CTXDESC_L1_DESC_DWORDS << 3);
        }
 
-       cd_table->cdtab = dmam_alloc_coherent(smmu->dev, l1size, &cd_table->cdtab_dma,
-                                          GFP_KERNEL);
+       cd_table->cdtab = dma_alloc_coherent(smmu->dev, l1size,
+                                            &cd_table->cdtab_dma, GFP_KERNEL);
        if (!cd_table->cdtab) {
                dev_warn(smmu->dev, "failed to allocate context descriptor\n");
                ret = -ENOMEM;
@@ -1458,7 +1458,7 @@ static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master)
 
 err_free_l1:
        if (cd_table->l1_desc) {
-               devm_kfree(smmu->dev, cd_table->l1_desc);
+               kfree(cd_table->l1_desc);
                cd_table->l1_desc = NULL;
        }
        return ret;
@@ -1478,21 +1478,18 @@ static void arm_smmu_free_cd_tables(struct arm_smmu_master *master)
                        if (!cd_table->l1_desc[i].l2ptr)
                                continue;
 
-                       dmam_free_coherent(smmu->dev, size,
-                                          cd_table->l1_desc[i].l2ptr,
-                                          cd_table->l1_desc[i].l2ptr_dma);
+                       dma_free_coherent(smmu->dev, size,
+                                         cd_table->l1_desc[i].l2ptr,
+                                         cd_table->l1_desc[i].l2ptr_dma);
                }
-               devm_kfree(smmu->dev, cd_table->l1_desc);
-               cd_table->l1_desc = NULL;
+               kfree(cd_table->l1_desc);
 
                l1size = cd_table->num_l1_ents * (CTXDESC_L1_DESC_DWORDS << 3);
        } else {
                l1size = cd_table->num_l1_ents * (CTXDESC_CD_DWORDS << 3);
        }
 
-       dmam_free_coherent(smmu->dev, l1size, cd_table->cdtab, cd_table->cdtab_dma);
-       cd_table->cdtab_dma = 0;
-       cd_table->cdtab = NULL;
+       dma_free_coherent(smmu->dev, l1size, cd_table->cdtab, cd_table->cdtab_dma);
 }
 
 /* Stream table manipulation functions */