Re: [PATCH v3 25/34] dmaengine: mv_xor_v2: use channel BH helpers
From: Frank Li
Date: Wed Sep 02 2026 - 11:41:20 EST
On Mon, Aug 10, 2026 at 11:09:26AM -0700, Allen Pais wrote:
> Replace the device tasklet with the per-channel BH helper so descriptor
> callbacks run through dmaengine_*_bh.
>
> Signed-off-by: Allen Pais <allen.lkml@xxxxxxxxx>
> ---
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
> drivers/dma/mv_xor_v2.c | 20 +++++++++-----------
> 1 file changed, 9 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/dma/mv_xor_v2.c b/drivers/dma/mv_xor_v2.c
> index cad4d4fb51ac..14d563ec6bf0 100644
> --- a/drivers/dma/mv_xor_v2.c
> +++ b/drivers/dma/mv_xor_v2.c
> @@ -139,7 +139,6 @@ struct mv_xor_v2_descriptor {
> * @reg_clk: reference to the 'reg' clock
> * @dma_base: memory mapped DMA register base
> * @glob_base: memory mapped global register base
> - * @irq_tasklet: tasklet used for IRQ handling call-backs
> * @free_sw_desc: linked list of free SW descriptors
> * @dmadev: dma device
> * @dmachan: dma channel
> @@ -158,7 +157,6 @@ struct mv_xor_v2_device {
> void __iomem *glob_base;
> struct clk *clk;
> struct clk *reg_clk;
> - struct tasklet_struct irq_tasklet;
> struct list_head free_sw_desc;
> struct dma_device dmadev;
> struct dma_chan dmachan;
> @@ -290,8 +288,8 @@ static irqreturn_t mv_xor_v2_interrupt_handler(int irq, void *data)
> if (!ndescs)
> return IRQ_NONE;
>
> - /* schedule a tasklet to handle descriptors callbacks */
> - tasklet_schedule(&xor_dev->irq_tasklet);
> + /* schedule a bottom half to handle descriptors callbacks */
> + dmaengine_schedule_bh(&xor_dev->dmachan);
>
> return IRQ_HANDLED;
> }
> @@ -346,8 +344,8 @@ mv_xor_v2_prep_sw_desc(struct mv_xor_v2_device *xor_dev)
>
> if (list_empty(&xor_dev->free_sw_desc)) {
> spin_unlock_bh(&xor_dev->lock);
> - /* schedule tasklet to free some descriptors */
> - tasklet_schedule(&xor_dev->irq_tasklet);
> + /* schedule bottom half to free some descriptors */
> + dmaengine_schedule_bh(&xor_dev->dmachan);
> return NULL;
> }
>
> @@ -553,10 +551,10 @@ int mv_xor_v2_get_pending_params(struct mv_xor_v2_device *xor_dev,
> /*
> * handle the descriptors after HW process
> */
> -static void mv_xor_v2_tasklet(struct tasklet_struct *t)
> +static void mv_xor_v2_tasklet(struct dma_chan *chan)
> {
> - struct mv_xor_v2_device *xor_dev = from_tasklet(xor_dev, t,
> - irq_tasklet);
> + struct mv_xor_v2_device *xor_dev =
> + container_of(chan, struct mv_xor_v2_device, dmachan);
> int pending_ptr, num_of_pending, i;
> struct mv_xor_v2_sw_desc *next_pending_sw_desc = NULL;
>
> @@ -760,7 +758,7 @@ static int mv_xor_v2_probe(struct platform_device *pdev)
> if (ret)
> goto free_msi_irqs;
>
> - tasklet_setup(&xor_dev->irq_tasklet, mv_xor_v2_tasklet);
> + dmaengine_init_bh(&xor_dev->dmachan, mv_xor_v2_tasklet);
>
> xor_dev->desc_size = mv_xor_v2_set_desc_size(xor_dev);
>
> @@ -869,7 +867,7 @@ static void mv_xor_v2_remove(struct platform_device *pdev)
>
> platform_device_msi_free_irqs_all(&pdev->dev);
>
> - tasklet_kill(&xor_dev->irq_tasklet);
> + dmaengine_kill_bh(&xor_dev->dmachan);
> }
>
> #ifdef CONFIG_OF
> --
> 2.43.0
>