iommu/arm-smmu: Use new devm_krealloc()
authorRobin Murphy <robin.murphy@arm.com>
Mon, 26 Oct 2020 12:00:22 +0000 (12:00 +0000)
committerWill Deacon <will@kernel.org>
Fri, 6 Nov 2020 12:38:30 +0000 (12:38 +0000)
The implementation-specific subclassing of struct arm_smmu_device really
wanted an appropriate version of realloc(). Now that one exists, take
full advantage of it to clarify what's actually being done here.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/355e8d70c7f47d462d85b386aa09f2b5c655f023.1603713428.git.robin.murphy@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/arm/arm-smmu/arm-smmu-impl.c
drivers/iommu/arm/arm-smmu/arm-smmu-nvidia.c
drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c

index 88f17cc33023bcba26b40d171698e84baa0bee6f..336f36ed9ed70ea70996bc38a7beee9fd58dbd52 100644 (file)
@@ -91,15 +91,12 @@ static struct arm_smmu_device *cavium_smmu_impl_init(struct arm_smmu_device *smm
 {
        struct cavium_smmu *cs;
 
-       cs = devm_kzalloc(smmu->dev, sizeof(*cs), GFP_KERNEL);
+       cs = devm_krealloc(smmu->dev, smmu, sizeof(*cs), GFP_KERNEL);
        if (!cs)
                return ERR_PTR(-ENOMEM);
 
-       cs->smmu = *smmu;
        cs->smmu.impl = &cavium_impl;
 
-       devm_kfree(smmu->dev, smmu);
-
        return &cs->smmu;
 }
 
index 31368057e9becae5d6582cfb9a2825d8f40f18f8..29117444e5a0632a8e21edcb3ae0dd033d25df70 100644 (file)
@@ -242,18 +242,10 @@ struct arm_smmu_device *nvidia_smmu_impl_init(struct arm_smmu_device *smmu)
        struct nvidia_smmu *nvidia_smmu;
        struct platform_device *pdev = to_platform_device(dev);
 
-       nvidia_smmu = devm_kzalloc(dev, sizeof(*nvidia_smmu), GFP_KERNEL);
+       nvidia_smmu = devm_krealloc(dev, smmu, sizeof(*nvidia_smmu), GFP_KERNEL);
        if (!nvidia_smmu)
                return ERR_PTR(-ENOMEM);
 
-       /*
-        * Copy the data from struct arm_smmu_device *smmu allocated in
-        * arm-smmu.c. The smmu from struct nvidia_smmu replaces the smmu
-        * pointer used in arm-smmu.c once this function returns.
-        * This is necessary to derive nvidia_smmu from smmu pointer passed
-        * through arm_smmu_impl function calls subsequently.
-        */
-       nvidia_smmu->smmu = *smmu;
        /* Instance 0 is ioremapped by arm-smmu.c. */
        nvidia_smmu->bases[0] = smmu->base;
 
@@ -267,12 +259,5 @@ struct arm_smmu_device *nvidia_smmu_impl_init(struct arm_smmu_device *smmu)
 
        nvidia_smmu->smmu.impl = &nvidia_smmu_impl;
 
-       /*
-        * Free the struct arm_smmu_device *smmu allocated in arm-smmu.c.
-        * Once this function returns, arm-smmu.c would use arm_smmu_device
-        * allocated as part of struct nvidia_smmu.
-        */
-       devm_kfree(dev, smmu);
-
        return &nvidia_smmu->smmu;
 }
index 66ba4870659f44a7acce5f4484885caba0319c60..86f0d182703ebca887bc2c7707032d6cad2f5192 100644 (file)
@@ -159,14 +159,11 @@ struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
 {
        struct qcom_smmu *qsmmu;
 
-       qsmmu = devm_kzalloc(smmu->dev, sizeof(*qsmmu), GFP_KERNEL);
+       qsmmu = devm_krealloc(smmu->dev, smmu, sizeof(*qsmmu), GFP_KERNEL);
        if (!qsmmu)
                return ERR_PTR(-ENOMEM);
 
-       qsmmu->smmu = *smmu;
-
        qsmmu->smmu.impl = &qcom_smmu_impl;
-       devm_kfree(smmu->dev, smmu);
 
        return &qsmmu->smmu;
 }