Re: [PATCH v3 12/34] dmaengine: mv_xor: convert irq tasklet to dmaengine BH

From: Frank Li

Date: Wed Sep 02 2026 - 10:52:30 EST


On Mon, Aug 10, 2026 at 11:09:13AM -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/mv_xor.c | 12 ++++++------
> drivers/dma/mv_xor.h | 2 --
> 2 files changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c
> index 25ed61f1b089..752e30ca5fa8 100644
> --- a/drivers/dma/mv_xor.c
> +++ b/drivers/dma/mv_xor.c
> @@ -327,7 +327,7 @@ static void mv_chan_slot_cleanup(struct mv_xor_chan *mv_chan)
> * some descriptors are still waiting
> * to be cleaned
> */
> - tasklet_schedule(&mv_chan->irq_tasklet);
> + dmaengine_schedule_bh(&mv_chan->dmachan);
> }
> }
> }
> @@ -336,9 +336,9 @@ static void mv_chan_slot_cleanup(struct mv_xor_chan *mv_chan)
> mv_chan->dmachan.completed_cookie = cookie;
> }
>
> -static void mv_xor_tasklet(struct tasklet_struct *t)
> +static void mv_xor_tasklet(struct dma_chan *c)
> {
> - struct mv_xor_chan *chan = from_tasklet(chan, t, irq_tasklet);
> + struct mv_xor_chan *chan = to_mv_xor_chan(c);
>
> spin_lock(&chan->lock);
> mv_chan_slot_cleanup(chan);
> @@ -372,7 +372,7 @@ mv_chan_alloc_slot(struct mv_xor_chan *mv_chan)
> spin_unlock_bh(&mv_chan->lock);
>
> /* try to free some slots if the allocation fails */
> - tasklet_schedule(&mv_chan->irq_tasklet);
> + dmaengine_schedule_bh(&mv_chan->dmachan);
>
> return NULL;
> }
> @@ -737,7 +737,7 @@ static irqreturn_t mv_xor_interrupt_handler(int irq, void *data)
> if (intr_cause & XOR_INTR_ERRORS)
> mv_chan_err_interrupt_handler(chan, intr_cause);
>
> - tasklet_schedule(&chan->irq_tasklet);
> + dmaengine_schedule_bh(&chan->dmachan);
>
> mv_chan_clear_eoc_cause(chan);
>
> @@ -1107,7 +1107,7 @@ mv_xor_channel_add(struct mv_xor_device *xordev,
>
> mv_chan->mmr_base = xordev->xor_base;
> mv_chan->mmr_high_base = xordev->xor_high_base;
> - tasklet_setup(&mv_chan->irq_tasklet, mv_xor_tasklet);
> + dmaengine_init_bh(&mv_chan->dmachan, mv_xor_tasklet);
>
> /* clear errors before enabling interrupts */
> mv_chan_clear_err_status(mv_chan);
> diff --git a/drivers/dma/mv_xor.h b/drivers/dma/mv_xor.h
> index c87cefd38a07..27774abe34a6 100644
> --- a/drivers/dma/mv_xor.h
> +++ b/drivers/dma/mv_xor.h
> @@ -98,7 +98,6 @@ struct mv_xor_device {
> * @device: parent device
> * @common: common dmaengine channel object members
> * @slots_allocated: records the actual size of the descriptor slot pool
> - * @irq_tasklet: bottom half where mv_xor_slot_cleanup runs
> * @op_in_desc: new mode of driver, each op is written to descriptor.
> */
> struct mv_xor_chan {
> @@ -118,7 +117,6 @@ struct mv_xor_chan {
> struct dma_device dmadev;
> struct dma_chan dmachan;
> int slots_allocated;
> - struct tasklet_struct irq_tasklet;
> int op_in_desc;
> char dummy_src[MV_XOR_MIN_BYTE_COUNT];
> char dummy_dst[MV_XOR_MIN_BYTE_COUNT];
> --
> 2.43.0
>