Use devm_add_action_or_reset to avoid the situation where the release function is not called when devm_add_action returns an error.
Signed-off-by: Tian Tao <tiant...@hisilicon.com> --- v2: repositioning devm_add_action_or_reset in the function arm_smmu_setup_msis, and check the return value. --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 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 2ddf5ec..b4d3b7d 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2680,7 +2680,8 @@ static int arm_smmu_cmdq_init(struct arm_smmu_device *smmu) ret = -ENOMEM; } else { cmdq->valid_map = bitmap; - devm_add_action(smmu->dev, arm_smmu_cmdq_free_bitmap, bitmap); + ret = devm_add_action_or_reset(smmu->dev, + arm_smmu_cmdq_free_bitmap, bitmap); } return ret; @@ -2921,6 +2922,13 @@ static void arm_smmu_setup_msis(struct arm_smmu_device *smmu) return; } + /* Add callback to free MSIs on teardown */ + ret = devm_add_action_or_reset(dev, arm_smmu_free_msis, dev); + if (ret) { + dev_warn(dev, "failed to add callback to free MSIs on teardown\n"); + return; + } + for_each_msi_entry(desc, dev) { switch (desc->platform.msi_index) { case EVTQ_MSI_INDEX: @@ -2936,9 +2944,6 @@ static void arm_smmu_setup_msis(struct arm_smmu_device *smmu) continue; } } - - /* Add callback to free MSIs on teardown */ - devm_add_action(dev, arm_smmu_free_msis, dev); } static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu) -- 2.7.4 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu