Re: [PATCH v3 16/34] dmaengine: ppc4xx: replace irq tasklet with dmaengine BH
From: Frank Li
Date: Wed Sep 02 2026 - 11:41:43 EST
On Mon, Aug 10, 2026 at 11:09:17AM -0700, Allen Pais wrote:
> Replace the per-channel tasklet with the shared dmaengine BH helper.
> The handler continues to run in softirq context while dmaengine owns
> the common scheduling and teardown mechanism.
>
> Signed-off-by: Allen Pais <allen.lkml@xxxxxxxxx>
> ---
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
> drivers/dma/ppc4xx/adma.c | 14 +++++++-------
> drivers/dma/ppc4xx/adma.h | 2 --
> 2 files changed, 7 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/dma/ppc4xx/adma.c b/drivers/dma/ppc4xx/adma.c
> index 279a431ccae3..bc10c2b5dd12 100644
> --- a/drivers/dma/ppc4xx/adma.c
> +++ b/drivers/dma/ppc4xx/adma.c
> @@ -1658,9 +1658,9 @@ static void __ppc440spe_adma_slot_cleanup(struct ppc440spe_adma_chan *chan)
> /**
> * ppc440spe_adma_tasklet - clean up watch-dog initiator
> */
> -static void ppc440spe_adma_tasklet(struct tasklet_struct *t)
> +static void ppc440spe_adma_tasklet(struct dma_chan *c)
> {
> - struct ppc440spe_adma_chan *chan = from_tasklet(chan, t, irq_tasklet);
> + struct ppc440spe_adma_chan *chan = to_ppc440spe_adma_chan(c);
>
> spin_lock_nested(&chan->lock, SINGLE_DEPTH_NESTING);
> __ppc440spe_adma_slot_cleanup(chan);
> @@ -1754,7 +1754,7 @@ static struct ppc440spe_adma_desc_slot *ppc440spe_adma_alloc_slots(
> goto retry;
>
> /* try to free some slots if the allocation fails */
> - tasklet_schedule(&chan->irq_tasklet);
> + dmaengine_schedule_bh(&chan->common);
> return NULL;
> }
>
> @@ -3595,7 +3595,7 @@ static irqreturn_t ppc440spe_adma_eot_handler(int irq, void *data)
> dev_dbg(chan->device->common.dev,
> "ppc440spe adma%d: %s\n", chan->device->id, __func__);
>
> - tasklet_schedule(&chan->irq_tasklet);
> + dmaengine_schedule_bh(&chan->common);
> ppc440spe_adma_device_clear_eot_status(chan);
>
> return IRQ_HANDLED;
> @@ -3612,7 +3612,7 @@ static irqreturn_t ppc440spe_adma_err_handler(int irq, void *data)
> dev_dbg(chan->device->common.dev,
> "ppc440spe adma%d: %s\n", chan->device->id, __func__);
>
> - tasklet_schedule(&chan->irq_tasklet);
> + dmaengine_schedule_bh(&chan->common);
> ppc440spe_adma_device_clear_eot_status(chan);
>
> return IRQ_HANDLED;
> @@ -4137,7 +4137,7 @@ static int ppc440spe_adma_probe(struct platform_device *ofdev)
> chan->common.device = &adev->common;
> dma_cookie_init(&chan->common);
> list_add_tail(&chan->common.device_node, &adev->common.channels);
> - tasklet_setup(&chan->irq_tasklet, ppc440spe_adma_tasklet);
> + dmaengine_init_bh(&chan->common, ppc440spe_adma_tasklet);
>
> /* allocate and map helper pages for async validation or
> * async_mult/async_sum_product operations on DMA0/1.
> @@ -4247,7 +4247,7 @@ static void ppc440spe_adma_remove(struct platform_device *ofdev)
> device_node) {
> ppc440spe_chan = to_ppc440spe_adma_chan(chan);
> ppc440spe_adma_release_irqs(adev, ppc440spe_chan);
> - tasklet_kill(&ppc440spe_chan->irq_tasklet);
> + dmaengine_kill_bh(&ppc440spe_chan->common);
> if (adev->id != PPC440SPE_XOR_ID) {
> dma_unmap_page(&ofdev->dev, ppc440spe_chan->pdest,
> PAGE_SIZE, DMA_BIDIRECTIONAL);
> diff --git a/drivers/dma/ppc4xx/adma.h b/drivers/dma/ppc4xx/adma.h
> index f8a5d7c1fb40..9af1feaf0b9a 100644
> --- a/drivers/dma/ppc4xx/adma.h
> +++ b/drivers/dma/ppc4xx/adma.h
> @@ -80,7 +80,6 @@ struct ppc440spe_adma_device {
> * @pending: allows batching of hardware operations
> * @slots_allocated: records the actual size of the descriptor slot pool
> * @hw_chain_inited: h/w descriptor chain initialization flag
> - * @irq_tasklet: bottom half where ppc440spe_adma_slot_cleanup runs
> * @needs_unmap: if buffers should not be unmapped upon final processing
> * @pdest_page: P destination page for async validate operation
> * @qdest_page: Q destination page for async validate operation
> @@ -97,7 +96,6 @@ struct ppc440spe_adma_chan {
> int pending;
> int slots_allocated;
> int hw_chain_inited;
> - struct tasklet_struct irq_tasklet;
> u8 needs_unmap;
> struct page *pdest_page;
> struct page *qdest_page;
> --
> 2.43.0
>