[PATCH 5/7] iommu/arm-smmu-v3: Do not use devm for the cd table allocations
Jason Gunthorpe
jgg at nvidia.com
Mon Jun 3 15:31:31 PDT 2024
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.
Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>
---
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 45 +++++++++------------
1 file changed, 19 insertions(+), 26 deletions(-)
diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
index 24c286a0834445..3f2e0462433d2d 100644
--- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
+++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
@@ -1172,13 +1172,10 @@ static int arm_smmu_alloc_cd_leaf_table(struct arm_smmu_device *smmu,
{
size_t size = CTXDESC_L2_ENTRIES * sizeof(struct arm_smmu_cd);
- l1_desc->l2ptr = dmam_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");
+ l1_desc->l2ptr = dma_alloc_coherent(smmu->dev, size,
+ &l1_desc->l2ptr_dma, GFP_KERNEL);
+ if (!l1_desc->l2ptr)
return -ENOMEM;
- }
return 0;
}
@@ -1363,7 +1360,7 @@ static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master)
cd_table->s1fmt = STRTAB_STE_0_S1FMT_LINEAR;
cd_table->num_l1_ents = max_contexts;
- cd_table->cdtab.linear = dmam_alloc_coherent(
+ cd_table->cdtab.linear = dma_alloc_coherent(
smmu->dev, max_contexts * sizeof(struct arm_smmu_cd),
&cd_table->cdtab_dma, GFP_KERNEL);
if (!cd_table->cdtab.linear)
@@ -1375,17 +1372,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.l1_desc = dmam_alloc_coherent(
+ cd_table->cdtab.l1_desc = dma_alloc_coherent(
smmu->dev, l1size, &cd_table->cdtab_dma, GFP_KERNEL);
if (!cd_table->cdtab.l1_desc) {
- devm_kfree(smmu->dev, cd_table->l1_desc);
+ kfree(cd_table->l1_desc);
cd_table->l1_desc = NULL;
return -ENOMEM;
}
@@ -1407,25 +1404,21 @@ 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);
- dmam_free_coherent(smmu->dev, l1size, cd_table->cdtab.l1_desc,
- cd_table->cdtab_dma);
+ dma_free_coherent(smmu->dev, l1size, cd_table->cdtab.l1_desc,
+ cd_table->cdtab_dma);
} else {
- dmam_free_coherent(smmu->dev,
- cd_table->num_l1_ents *
- sizeof(struct arm_smmu_cd),
- cd_table->cdtab.linear, cd_table->cdtab_dma);
+ dma_free_coherent(smmu->dev,
+ cd_table->num_l1_ents *
+ sizeof(struct arm_smmu_cd),
+ cd_table->cdtab.linear, cd_table->cdtab_dma);
}
-
- cd_table->cdtab_dma = 0;
- cd_table->cdtab.linear = NULL;
}
bool arm_smmu_free_asid(struct arm_smmu_ctx_desc *cd)
--
2.45.2
More information about the linux-arm-kernel
mailing list