From b6ac46db74398e8e09fe228775fb607c19e99573 Mon Sep 17 00:00:00 2001 From: Patrick Daly Date: Mon, 22 Feb 2021 13:12:14 -0800 Subject: [PATCH] arm-smmu: Fix iommu group refcount leak If a client defines the qcom,iommu-group property, and the iommu group does not yet exist, of_get_device_group will create a new group with a refcount of one. The following call to iommu_group_ref_get() increments the refcount unnecessarily and causes a resource leak. If a client defines the qcom,iommu-group property, and the iommu group already exists, modify __bus_lookup_iommu_group() to return with an additional refcount. Change-Id: I5c9e62e50737ee4128a591ea2b14a0d47a1be162 Signed-off-by: Patrick Daly --- drivers/iommu/arm-smmu.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c index 9e445242f8ec..1fa59c6b6cd7 100644 --- a/drivers/iommu/arm-smmu.c +++ b/drivers/iommu/arm-smmu.c @@ -3023,7 +3023,6 @@ static int __bus_lookup_iommu_group(struct device *dev, void *priv) } data->group = group; - iommu_group_put(group); return 1; } @@ -3703,6 +3702,9 @@ static struct iommu_group *arm_smmu_device_group(struct device *dev) int i, idx; group = of_get_device_group(dev); + if (group) + goto finish; + for_each_cfg_sme(fwspec, i, idx) { if (group && smmu->s2crs[idx].group && group != smmu->s2crs[idx].group) { @@ -3729,6 +3731,7 @@ static struct iommu_group *arm_smmu_device_group(struct device *dev) return NULL; } +finish: if (smmu->impl && smmu->impl->device_group && smmu->impl->device_group(dev, group)) { iommu_group_put(group);