summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeimin Xiong <xiongwm2026@163.com>2026-07-16 09:32:29 +0800
committerWill Deacon <will@kernel.org>2026-07-24 13:05:53 +0000
commit535a200220ca2c83bc8bf54bd2cbe045d6ee70c4 (patch)
tree16fd39b7fe31d5d4a7bd9be75f0b918bca19b955
parent649e5ef83671009bb89d683f54b16615adf94bf0 (diff)
downloadlinux-next-535a200220ca2c83bc8bf54bd2cbe045d6ee70c4.tar.gz
linux-next-535a200220ca2c83bc8bf54bd2cbe045d6ee70c4.zip
iommu/msm: Unwind probe state on registration failure
msm_iommu_probe() adds its devm-managed IOMMU object to qcom_iommu_devices before adding the IOMMU sysfs device and registering it with the IOMMU core. If iommu_device_sysfs_add() fails, probe returns with the object still on qcom_iommu_devices. The driver core then releases the devm allocation, leaving a dangling list entry that later list walks may dereference. If iommu_device_register() fails, the same dangling list entry remains and the sysfs device is left registered as well. Unwind the sysfs device and global list entry in reverse setup order on the corresponding failure paths. Fixes: 42df43b36163 ("iommu/msm: Make use of iommu_device_register interface") Cc: stable@vger.kernel.org Reviewed-by: Mukesh Ojha <mukesh.ojha@oss.qualcomm.com> Signed-off-by: Weimin Xiong <xiongwm2026@163.com> Signed-off-by: Will Deacon <will@kernel.org>
-rw-r--r--drivers/iommu/msm_iommu.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/iommu/msm_iommu.c b/drivers/iommu/msm_iommu.c
index 038f6ed797ea..4ef1e8c8244b 100644
--- a/drivers/iommu/msm_iommu.c
+++ b/drivers/iommu/msm_iommu.c
@@ -787,19 +787,25 @@ static int msm_iommu_probe(struct platform_device *pdev)
"msm-smmu.%pa", &ioaddr);
if (ret) {
pr_err("Could not add msm-smmu at %pa to sysfs\n", &ioaddr);
- return ret;
+ goto err_remove_list;
}
ret = iommu_device_register(&iommu->iommu, &msm_iommu_ops, &pdev->dev);
if (ret) {
pr_err("Could not register msm-smmu at %pa\n", &ioaddr);
- return ret;
+ goto err_remove_sysfs;
}
pr_info("device mapped at %p, irq %d with %d ctx banks\n",
iommu->base, iommu->irq, iommu->ncb);
return ret;
+
+err_remove_sysfs:
+ iommu_device_sysfs_remove(&iommu->iommu);
+err_remove_list:
+ list_del(&iommu->dev_node);
+ return ret;
}
static const struct of_device_id msm_iommu_dt_match[] = {