iommu/arm-smmu-v3: Do not zero the strtab twice
authorJason Gunthorpe <jgg@nvidia.com>
Tue, 11 Jun 2024 00:31:10 +0000 (21:31 -0300)
committerWill Deacon <will@kernel.org>
Tue, 2 Jul 2024 15:33:58 +0000 (16:33 +0100)
dmam_alloc_coherent() already returns zero'd memory so cfg->strtab.l1_desc
(the list of DMA addresses for the L2 entries) is already zero'd.

arm_smmu_init_l1_strtab() goes through and calls
arm_smmu_write_strtab_l1_desc() on the newly allocated (and zero'd) struct
arm_smmu_strtab_l1_desc, which ends up computing 'val = 0' and zeroing it
again.

Remove arm_smmu_init_l1_strtab() and just call devm_kcalloc() from
arm_smmu_init_strtab_2lvl to allocate the companion struct.

Tested-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Mostafa Saleh <smostafa@google.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Link: https://lore.kernel.org/r/1-v2-318ed5f6983b+198f-smmuv3_tidy_jgg@nvidia.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c

index 8c3031fe542b2ee965ae402cbf3d1c3eea1df733..bb2d9b0c0f6342eaadfd5b89f3f8b3c4e3692db7 100644 (file)
@@ -3523,25 +3523,6 @@ static int arm_smmu_init_queues(struct arm_smmu_device *smmu)
                                       PRIQ_ENT_DWORDS, "priq");
 }
 
-static int arm_smmu_init_l1_strtab(struct arm_smmu_device *smmu)
-{
-       unsigned int i;
-       struct arm_smmu_strtab_cfg *cfg = &smmu->strtab_cfg;
-       void *strtab = smmu->strtab_cfg.strtab;
-
-       cfg->l1_desc = devm_kcalloc(smmu->dev, cfg->num_l1_ents,
-                                   sizeof(*cfg->l1_desc), GFP_KERNEL);
-       if (!cfg->l1_desc)
-               return -ENOMEM;
-
-       for (i = 0; i < cfg->num_l1_ents; ++i) {
-               arm_smmu_write_strtab_l1_desc(strtab, &cfg->l1_desc[i]);
-               strtab += STRTAB_L1_DESC_DWORDS << 3;
-       }
-
-       return 0;
-}
-
 static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
 {
        void *strtab;
@@ -3577,7 +3558,12 @@ static int arm_smmu_init_strtab_2lvl(struct arm_smmu_device *smmu)
        reg |= FIELD_PREP(STRTAB_BASE_CFG_SPLIT, STRTAB_SPLIT);
        cfg->strtab_base_cfg = reg;
 
-       return arm_smmu_init_l1_strtab(smmu);
+       cfg->l1_desc = devm_kcalloc(smmu->dev, cfg->num_l1_ents,
+                                   sizeof(*cfg->l1_desc), GFP_KERNEL);
+       if (!cfg->l1_desc)
+               return -ENOMEM;
+
+       return 0;
 }
 
 static int arm_smmu_init_strtab_linear(struct arm_smmu_device *smmu)