linux/drivers/iommu
Danilo Krummrich bb99c46423 iommu/arm-smmu-qcom: do not register driver in probe()
commit ed1ac3c977 upstream.

Commit 0b4eeee287 ("iommu/arm-smmu-qcom: Register the TBU driver in
qcom_smmu_impl_init") intended to also probe the TBU driver when
CONFIG_ARM_SMMU_QCOM_DEBUG is disabled, but also moved the corresponding
platform_driver_register() call into qcom_smmu_impl_init() which is
called from arm_smmu_device_probe().

However, it neither makes sense to register drivers from probe()
callbacks of other drivers, nor does the driver core allow registering
drivers with a device lock already being held.

The latter was revealed by commit dc23806a7c ("driver core: enforce
device_lock for driver_match_device()") leading to a deadlock condition
described in [1].

Additionally, it was noted by Robin that the current approach is
potentially racy with async probe [2].

Hence, fix this by registering the qcom_smmu_tbu_driver from
module_init(). Unfortunately, due to the vendoring of the driver, this
requires an indirection through arm-smmu-impl.c.

Reported-by: Mark Brown <broonie@kernel.org>
Closes: https://lore.kernel.org/lkml/7ae38e31-ef31-43ad-9106-7c76ea0e8596@sirena.org.uk/
Link: https://lore.kernel.org/lkml/DFU7CEPUSG9A.1KKGVW4HIPMSH@kernel.org/ [1]
Link: https://lore.kernel.org/lkml/0c0d3707-9ea5-44f9-88a1-a65c62e3df8d@arm.com/ [2]
Fixes: dc23806a7c ("driver core: enforce device_lock for driver_match_device()")
Fixes: 0b4eeee287 ("iommu/arm-smmu-qcom: Register the TBU driver in qcom_smmu_impl_init")
Acked-by: Robin Murphy <robin.murphy@arm.com>
Tested-by: Bjorn Andersson <andersson@kernel.org>
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Acked-by: Konrad Dybcio <konradybcio@kernel.org>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com> #LX2160ARDB
Tested-by: Wang Jiayue <akaieurus@gmail.com>
Reviewed-by: Wang Jiayue <akaieurus@gmail.com>
Tested-by: Mark Brown <broonie@kernel.org>
Acked-by: Joerg Roedel <joerg.roedel@amd.com>
Link: https://patch.msgid.link/20260121141215.29658-1-dakr@kernel.org
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-02-19 16:33:26 +01:00
..
amd iommu/amd: Fix error path in amd_iommu_probe_device() 2026-01-18 11:03:12 +01:00
arm iommu/arm-smmu-qcom: do not register driver in probe() 2026-02-19 16:33:26 +01:00
generic_pt iommupt: Only cache flush memory changed by unmap 2026-01-28 15:14:17 +01:00
intel iommu/vt-d: Treat PAGE_SNOOP and PWSNP separately 2026-02-06 11:01:00 +01:00
iommufd iommufd: Initialize batch->kind in batch_clear() 2026-01-28 12:49:17 -04:00
riscv iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00
apple-dart.c iommu/apple-dart: fix device leak on of_xlate() 2025-11-17 09:49:42 +01:00
dma-iommu.c VFIO updates for v6.19-rc1 2025-12-04 18:42:48 -08:00
dma-iommu.h iommu: Drop sw_msi from iommu_domain 2025-03-25 10:18:19 -03:00
exynos-iommu.c iommu/exynos: fix device leak on of_xlate() 2025-11-17 09:49:42 +01:00
fsl_pamu.c iommu/fsl: fix all kernel-doc warnings in fsl_pamu.c 2023-03-22 14:50:15 +01:00
fsl_pamu.h iommu/fsl_pamu: hardcode the window address and size in pamu_config_ppaace 2021-04-07 10:56:52 +02:00
fsl_pamu_domain.c iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00
fsl_pamu_domain.h iommu/fsl_pamu: remove the snoop_id field 2021-04-07 10:56:52 +02:00
hyperv-iommu.c x86/hyperv: Clean up hv_map/unmap_interrupt() return values 2025-07-09 23:49:25 +00:00
io-pgfault.c iommu: Fix potential memory leak in iopf_queue_remove_device() 2025-02-10 14:49:30 +01:00
io-pgtable-arm-selftests.c iommu/io-pgtable-arm-selftests: Use KUnit 2025-11-13 16:25:32 +01:00
io-pgtable-arm-v7s.c iommu/io-pgtable-arm-v7s: Remove split on unmap behavior 2024-11-06 15:42:36 +00:00
io-pgtable-arm.c iommu/io-pgtable-arm: fix size_t signedness bug in unmap path 2026-01-20 18:07:35 +01:00
io-pgtable-arm.h iommu/io-pgtable-arm: Move some definitions to a header 2020-09-28 23:48:06 +01:00
io-pgtable-dart.c iommu/io-pgtable-dart: Fix off by one error in table index check 2025-09-13 08:07:25 +02:00
io-pgtable.c iommu/amd: Remove AMD io_pgtable support 2025-11-05 09:08:57 +01:00
iommu-debugfs.c iommu: Fix IOMMU debugfs fallout 2019-02-26 11:15:58 +01:00
iommu-pages.c iommu/pages: Add support for incoherent IOMMU page table walkers 2025-11-05 09:47:43 +01:00
iommu-pages.h iommu/pages: Add support for incoherent IOMMU page table walkers 2025-11-05 09:47:43 +01:00
iommu-priv.h iommufd: Register iommufd mock devices with fwspec 2025-09-30 09:54:12 -03:00
iommu-sva.c iommu/sva: include mmu_notifier.h header 2026-01-14 22:16:25 -08:00
iommu-sysfs.c iommu/sysfs: constify the class struct 2024-10-29 09:50:24 +01:00
iommu-traces.c iommu: Remove detach_dev callback 2023-01-13 16:39:18 +01:00
iommu.c iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00
iova.c - The series "zram: optimal post-processing target selection" from 2024-11-23 09:58:07 -08:00
ipmmu-vmsa.c iommu/ipmmu-vmsa: fix device leak on of_xlate() 2025-11-17 09:49:43 +01:00
irq_remapping.c IOMMU Updates for Linux v6.10 2024-05-18 10:55:13 -07:00
irq_remapping.h iommu/vt-d: Allocate DMAR fault interrupts locally 2024-04-26 11:57:36 +02:00
Kconfig Merge branches 'arm/smmu/updates', 'arm/smmu/bindings', 'mediatek', 'nvidia/tegra', 'intel/vt-d', 'amd/amd-vi' and 'core' into next 2025-11-28 08:44:21 +01:00
Makefile iommu/io-pgtable-arm-selftests: Use KUnit 2025-11-13 16:25:32 +01:00
msm_iommu.c iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00
msm_iommu.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 267 2019-06-05 17:30:29 +02:00
msm_iommu_hw-8xxx.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 267 2019-06-05 17:30:29 +02:00
mtk_iommu.c Merge branches 'arm/smmu/updates', 'arm/smmu/bindings', 'mediatek', 'nvidia/tegra', 'intel/vt-d', 'amd/amd-vi' and 'core' into next 2025-11-28 08:44:21 +01:00
mtk_iommu_v1.c iommu/mediatek-v1: add missing larb count sanity check 2025-11-17 09:49:44 +01:00
of_iommu.c iommu: Get DT/ACPI parsing into the proper probe path 2025-03-11 14:05:43 +01:00
omap-iommu-debug.c iommu/omap: Fix buffer overflow in debugfs 2022-09-07 10:42:28 +02:00
omap-iommu.c iommu/omap: simplify probe_device() error handling 2025-11-17 09:49:45 +01:00
omap-iommu.h iommu/omap: fix device leaks on probe_device() 2025-11-17 09:49:44 +01:00
omap-iopgtable.h iommu/omap: Fix -Woverflow warnings when compiling on 64-bit architectures 2020-03-04 16:24:46 +01:00
rockchip-iommu.c iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00
s390-iommu.c iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00
sprd-iommu.c iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00
sun50i-iommu.c iommu/sun50i: fix device leak on of_xlate() 2025-11-17 09:49:45 +01:00
tegra-smmu.c iommu/tegra: fix device leak on probe_device() 2025-11-17 09:49:45 +01:00
virtio-iommu.c iommu: Pass in old domain to attach_dev callback functions 2025-10-27 13:55:35 +01:00