On Tue, Dec 08, 2020 at 08:15:22PM +0800, Tian Tao wrote: > 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;
Honestly, wouldn't we just be better leaking memory in this case? Tearing down the SMMU is a pretty specialist sport _anyway_, but this seems to throw the baby out with the bath water by failing to initialise because we can't defer freeing something that we've already allocated. I think we're better off continuing and trying to get the device up and running. In fact, the same applies to the cmdq 'valid_map' too -- why do we care? WIll _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu