iommu/arm-smmu-v3: Do not use devm for the cd table allocations
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>
This commit is contained in:
committed by
Will Deacon
parent
8c153ef956
commit
47b2de35ca
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user