Re: [PATCH 1/1] dmaengine: virt-dma: convert tasklet to BH workqueue for callback invocation

From: Alexander Kochetkov
Date: Fri Jun 13 2025 - 14:51:40 EST


>
> It seems it was ordered. Please, preserve the order.
> It not, try to squeeze to have longest possible ordered chain
> (it can be interleaved with something unordered, just look at
> the big picture).
>
> (Same applies to other similar cases)

I'll this that in v2. Thanks!

> ...
>
> What about the driver(s) that use threaded IRQ instead?
> Do you plan to convert them as well?
>
> I am talking about current users of virt-dma that do not use tasklets.
>
> --
> With Best Regards,
> Andy Shevchenko
>

I think, I've found all the users of virt-dma. Could you, please,
provide example of such driver?
Here is what I did to locate current users of virt-dma.

I got list of drivers using following command:
grep -r -e 'struct virt_dma_chan' -e 'virt-dma.h' . | sort | cut -f 1
-d : | uniq

./drivers/dma/amba-pl08x.c
./drivers/dma/amd/ae4dma/ae4dma.h
./drivers/dma/amd/ptdma/ptdma.h
./drivers/dma/amd/qdma/qdma.c
./drivers/dma/amd/qdma/qdma.h
./drivers/dma/arm-dma350.c
./drivers/dma/at_hdmac.c
./drivers/dma/bcm2835-dma.c
./drivers/dma/dma-axi-dmac.c
./drivers/dma/dma-jz4780.c
./drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
./drivers/dma/dw-axi-dmac/dw-axi-dmac.h
./drivers/dma/dw-edma/dw-edma-core.c
./drivers/dma/dw-edma/dw-edma-core.h
./drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
./drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.h
./drivers/dma/fsl-edma-common.h
./drivers/dma/fsl-qdma.c
./drivers/dma/hisi_dma.c
./drivers/dma/hsu/hsu.h
./drivers/dma/idma64.h
./drivers/dma/img-mdc-dma.c
./drivers/dma/imx-sdma.c
./drivers/dma/k3dma.c
./drivers/dma/lgm/lgm-dma.c
./drivers/dma/loongson1-apb-dma.c
./drivers/dma/loongson2-apb-dma.c
./drivers/dma/mediatek/mtk-cqdma.c
./drivers/dma/mediatek/mtk-hsdma.c
./drivers/dma/mediatek/mtk-uart-apdma.c
./drivers/dma/milbeaut-hdmac.c
./drivers/dma/milbeaut-xdmac.c
./drivers/dma/moxart-dma.c
./drivers/dma/owl-dma.c
./drivers/dma/pxa_dma.c
./drivers/dma/qcom/bam_dma.c
./drivers/dma/qcom/gpi.c
./drivers/dma/qcom/qcom_adm.c
./drivers/dma/sa11x0-dma.c
./drivers/dma/sf-pdma/sf-pdma.c
./drivers/dma/sf-pdma/sf-pdma.h
./drivers/dma/sh/rz-dmac.c
./drivers/dma/sh/usb-dmac.c
./drivers/dma/sprd-dma.c
./drivers/dma/st_fdma.h
./drivers/dma/stm32/stm32-dma.c
./drivers/dma/stm32/stm32-dma3.c
./drivers/dma/stm32/stm32-mdma.c
./drivers/dma/sun4i-dma.c
./drivers/dma/sun6i-dma.c
./drivers/dma/tegra186-gpc-dma.c
./drivers/dma/tegra210-adma.c
./drivers/dma/ti/edma.c
./drivers/dma/ti/k3-udma.c
./drivers/dma/ti/omap-dma.c
./drivers/dma/uniphier-mdmac.c
./drivers/dma/uniphier-xdmac.c
./drivers/dma/virt-dma.c
./drivers/dma/virt-dma.h
./drivers/dma/xilinx/xdma.c
./drivers/dma/xilinx/xilinx_dpdma.c

After that I did following to find additional drivers, and found them
inside misc.
grep -r -e ae4dma.h -e ptdma.h -e qdma.h -e dw-axi-dmac.h -e
dw-edma-core.h -e dpaa2-qdma.h -e fsl-edma-common.h -e hsu.h -e
idma64.h -e sf-pdma.h -e st_fdma.h . | sort | cut -f 1 -d : | uniq

./drivers/dma/amd/ae4dma/ae4dma-dev.c
./drivers/dma/amd/ae4dma/ae4dma-pci.c
./drivers/dma/amd/ae4dma/ae4dma.h
./drivers/dma/amd/ptdma/ptdma-debugfs.c
./drivers/dma/amd/ptdma/ptdma-dev.c
./drivers/dma/amd/ptdma/ptdma-dmaengine.c
./drivers/dma/amd/ptdma/ptdma-pci.c
./drivers/dma/amd/qdma/qdma-comm-regs.c
./drivers/dma/amd/qdma/qdma.c
./drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
./drivers/dma/dw-edma/dw-edma-core.c
./drivers/dma/dw-edma/dw-edma-pcie.c
./drivers/dma/dw-edma/dw-edma-v0-core.c
./drivers/dma/dw-edma/dw-edma-v0-debugfs.c
./drivers/dma/dw-edma/dw-hdma-v0-core.c
./drivers/dma/dw-edma/dw-hdma-v0-debugfs.c
./drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
./drivers/dma/fsl-edma-common.c
./drivers/dma/fsl-edma-main.c
./drivers/dma/fsl-edma-trace.c
./drivers/dma/fsl-qdma.c
./drivers/dma/hsu/hsu.c
./drivers/dma/hsu/hsu.h
./drivers/dma/hsu/pci.c
./drivers/dma/idma64.c
./drivers/dma/idma64.h
./drivers/dma/mcf-edma-main.c
./drivers/dma/mediatek/mtk-cqdma.c
./drivers/dma/sf-pdma/sf-pdma.c
./drivers/dma/st_fdma.c
./drivers/dma/st_fdma.h
./drivers/mfd/intel-lpss.c
./drivers/net/ethernet/airoha/airoha_eth.c
./drivers/net/ethernet/mediatek/mtk_eth_soc.c
./drivers/net/ethernet/mediatek/mtk_eth_soc.h
./drivers/pci/controller/pcie-xilinx-dma-pl.c
./drivers/tty/serial/8250/8250_mid.c
./include/linux/dma/hsu.h

Just realized, that I missed to check this drivers:
./drivers/net/ethernet/airoha/airoha_eth.c
./drivers/net/ethernet/mediatek/mtk_eth_soc.c
./drivers/net/ethernet/mediatek/mtk_eth_soc.h
./drivers/pci/controller/pcie-xilinx-dma-pl.c
./drivers/tty/serial/8250/8250_mid.c

I've applied the following config to the kernel, to build all the
drivers. I've modified some Kconfig files in order all options apply.
And checked that every file in the above list builds successfully.
Some drivers have compile errors, unrelated to virt-dma. Some drivers
produce link errors, but compile success. I checked that each .o-file
has a reasonable size.

CONFIG_FORCE_PCI=y
CONFIG_PCI=y
CONFIG_AMD_QDMA=y
CONFIG_AMD_PTDMA=y
CONFIG_DW_AXI_DMAC=y
CONFIG_DW_EDMA=y
CONFIG_DW_EDMA_PCIE=y
CONFIG_INTEL_LDMA=y
CONFIG_MTK_HSDMA=y
CONFIG_MTK_CQDMA=y
CONFIG_MTK_UART_APDMA=y
# CONFIG_QCOM_ADM=y - error: assignment to 'u32 *' {aka 'unsigned int
*'} from incompatible pointer type 'phys_addr_t *'
CONFIG_QCOM_GPI_DMA=y
CONFIG_QCOM_BAM_DMA=y
CONFIG_SF_PDMA=y
CONFIG_STM32_DMA=y
CONFIG_STM32_MDMA=y
CONFIG_STM32_DMA3=y
CONFIG_DMA_OMAP=y
CONFIG_TI_EDMA=y
CONFIG_TI_K3_UDMA=y
CONFIG_XILINX_ZYNQMP_DPDMA=y
CONFIG_XILINX_XDMA=y
CONFIG_AMBA_PL08X=y
CONFIG_ARM_DMA350=y
# CONFIG_FSL_DMA=y - error: implicit declaration of function '__ilog2
CONFIG_FSL_EDMA=y
CONFIG_FSL_QDMA=y
CONFIG_MCF_EDMA=y
CONFIG_INTEL_IDMA64=y
CONFIG_DMA_SUN6I=y
CONFIG_DMA_SUN4I=y
CONFIG_AT_HDMAC=y
# CONFIG_ST_FDMA=y - link errors
CONFIG_K3_DMA=y
CONFIG_DMA_SA11X0=y
CONFIG_AXI_DMAC=y
CONFIG_IMG_MDC_DMA=y
CONFIG_UNIPHIER_XDMAC=y
CONFIG_UNIPHIER_MDMAC=y
CONFIG_LOONGSON1_APB_DMA=y
CONFIG_LOONGSON2_APB_DMA=y
CONFIG_DMA_BCM2835=y
CONFIG_TEGRA210_ADMA=y
CONFIG_TEGRA186_GPC_DMA=y
CONFIG_MOXART_DMA=y
CONFIG_DMA_JZ4780=y
CONFIG_IMX_SDMA=y
CONFIG_OWL_DMA=y
CONFIG_SPRD_DMA=y
CONFIG_MILBEAUT_XDMAC=y
CONFIG_MILBEAUT_HDMAC=y
CONFIG_HISI_DMA=y
# CONFIG_FSL_DPAA2_QDMA=y - link errors
CONFIG_RZ_DMAC=y
CONFIG_RENESAS_USB_DMAC=y
CONFIG_PXA_DMA=y
CONFIG_HSU_DMA=y
CONFIG_HSU_DMA_PCI=y
CONFIG_MFD_INTEL_LPSS=y