Re: [PATCH v5 2/7] dmaengine: add a bus for DMA channel devices

From: Peng Fan

Date: Wed Nov 11 2026 - 19:26:45 EST


On Wed, Nov 11, 2026 at 11:31:32AM -0600, Frank Li wrote:
>On Wed, Nov 11, 2026 at 09:47:30PM +0800, Peng Fan (OSS) wrote:
>> From: Peng Fan <peng.fan@xxxxxxx>
>>
>> DMA channel devices are currently created as class devices without a bus.
>> This works for sysfs, but it prevents per-channel DMA/IOMMU configuration:
>> of_dma_configure() only probes the IOMMU when dev->bus is set, and the
>> IOMMU core only installs probe/release notifiers for buses listed in
>> iommu_buses[].
>>
>> Drivers that need per-channel IOMMU support currently work around this by
>> assigning dev->bus after device_register(). That leaves the bus subsystem
>> reference count unbalanced because bus_add_device() already ran with a NULL
>> bus, and bus_remove_device() will later drop a reference that was never
>> taken.
>>
>> Add a dedicated bus for DMA channel devices and register it during
>> dmaengine initialisation. Use core_initcall so the bus exists before any
>> IOMMU driver can call iommu_device_register(), which iterates iommu_buses[]
>> and fails on an unregistered bus. The match callback always reports no
>> match, so no driver can bind to these devices. A follow-up patch will
>> register the channel devices on this bus.
>>
>> Clean up the unmap pools if dmaengine initialisation fails after they have
>> been allocated.
>>
>> Signed-off-by: Peng Fan <peng.fan@xxxxxxx>
>> ---
>> drivers/dma/dmaengine.c | 28 +++++++++++++++++++++++++---
>> include/linux/dmaengine.h | 4 ++++
>> 2 files changed, 29 insertions(+), 3 deletions(-)
>>
>...
>
>> diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
>> index 805668fbe437..14d8f182c7cb 100644
>> --- a/include/linux/dmaengine.h
>> +++ b/include/linux/dmaengine.h
>> @@ -412,6 +412,10 @@ struct dma_chan_dev {
>> bool chan_dma_dev;
>> };
>>
>> +#ifdef CONFIG_DMA_ENGINE
>> +extern const struct bus_type dma_chan_bus_type;
>
>New API, need use dmaengine prefix, dmaengine_chan_bus_type

Fix in v6.

>
>Not sure how other dmaengine support it before? Maybe already block for
>long time.

In drivers/dma/tegra186-gpc-dma.c:
1543 if (use_iommu_map) {
1544 chdev->bus = pdev->dev.bus;

I used similar method, but Sashiko spotted issue for v1 [1], we have to
add a new bus to handle it.

"
Does this illegally modify the bus type of an already-registered device?

This is executed after dmaenginem_async_device_register() has already called
device_add(). Since bus_add_device() is never executed, won't device_del()
invoke bus_remove_device() during driver unbinding or removal, causing a fatal
reference count underflow and use-after-free on the global platform_bus_type
subsystem?
"

[1] https://lore.kernel.org/dmaengine/20260916160608.099201F000FF@xxxxxxxxxxxxxxx/

Thanks
Peng

>
>Frank
>
>> +#endif
>> +
>> /**
>> * enum dma_slave_buswidth - defines bus width of the DMA slave
>> * device, source or target buses
>>
>> --
>> 2.34.1
>>
>