Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6ac46db authored by Patrick Daly's avatar Patrick Daly
Browse files

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: default avatarPatrick Daly <pdaly@codeaurora.org>
parent cb6f97e5
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -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);