mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
iommu/qcom: fix device leak on of_xlate()
Make sure to drop the reference taken to the iommu platform device when looking up its driver data during of_xlate(). Note that commite2eae09939("iommu/qcom: add missing put_device() call in qcom_iommu_of_xlate()") fixed the leak in a couple of error paths, but the reference is still leaking on success and late failures. Fixes:0ae349a0f3("iommu/qcom: Add qcom_iommu") Cc: stable@vger.kernel.org # 4.14:e2eae09939Cc: Rob Clark <robin.clark@oss.qualcomm.com> Cc: Yu Kuai <yukuai3@huawei.com> Acked-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Johan Hovold <johan@kernel.org> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
parent
a6eaa872c5
commit
6a3908ce56
|
|
@ -566,14 +566,14 @@ static int qcom_iommu_of_xlate(struct device *dev,
|
|||
|
||||
qcom_iommu = platform_get_drvdata(iommu_pdev);
|
||||
|
||||
put_device(&iommu_pdev->dev);
|
||||
|
||||
/* make sure the asid specified in dt is valid, so we don't have
|
||||
* to sanity check this elsewhere:
|
||||
*/
|
||||
if (WARN_ON(asid > qcom_iommu->max_asid) ||
|
||||
WARN_ON(qcom_iommu->ctxs[asid] == NULL)) {
|
||||
put_device(&iommu_pdev->dev);
|
||||
WARN_ON(qcom_iommu->ctxs[asid] == NULL))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!dev_iommu_priv_get(dev)) {
|
||||
dev_iommu_priv_set(dev, qcom_iommu);
|
||||
|
|
@ -582,10 +582,8 @@ static int qcom_iommu_of_xlate(struct device *dev,
|
|||
* multiple different iommu devices. Multiple context
|
||||
* banks are ok, but multiple devices are not:
|
||||
*/
|
||||
if (WARN_ON(qcom_iommu != dev_iommu_priv_get(dev))) {
|
||||
put_device(&iommu_pdev->dev);
|
||||
if (WARN_ON(qcom_iommu != dev_iommu_priv_get(dev)))
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return iommu_fwspec_add_ids(dev, &asid, 1);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user