Re: [PATCH v3 3/9] dmaengine: dw-edma: Serialize abort state updates
From: Frank Li
Date: Wed Jul 15 2026 - 14:57:05 EST
On Thu, Jul 16, 2026 at 02:57:34AM +0900, Koichiro Den wrote:
> dw_edma_abort_interrupt() drops vc.lock before changing request and
> status. issue_pending() can acquire the lock in that small window,
> observe the old busy state, and skip starting queued descriptors. Then
> the abort handler overwrites the channel status as idle, leaving the new
> descriptors stranded for good.
>
> Keep descriptor completion and the state transition in the same critical
> section.
>
> Fixes: e63d79d1ffcd ("dmaengine: Add Synopsys eDMA IP core driver")
> Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
> ---
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
> Changes in v3:
> - New patch for a pre-existing abort state race. (Sashiko)
>
> drivers/dma/dw-edma/dw-edma-core.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c
> index 44ef5fbe3fd4..272b03405746 100644
> --- a/drivers/dma/dw-edma/dw-edma-core.c
> +++ b/drivers/dma/dw-edma/dw-edma-core.c
> @@ -740,9 +740,9 @@ static void dw_edma_abort_interrupt(struct dw_edma_chan *chan)
> list_del(&vd->node);
> vchan_cookie_complete(vd);
> }
> - spin_unlock_irqrestore(&chan->vc.lock, flags);
> chan->request = EDMA_REQ_NONE;
> chan->status = EDMA_ST_IDLE;
> + spin_unlock_irqrestore(&chan->vc.lock, flags);
> }
>
> static void dw_edma_emul_irq_ack(struct irq_data *d)
> --
> 2.51.0
>