FAILED: patch "[PATCH] dmaengine: at_hdmac: Fix premature completion of desc in" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Possible dependencies:
fcd37565efda ("dmaengine: at_hdmac: Fix premature completion of desc in issue_pending") 8a47221fc284 ("dmaengine: at_hdmac: Start transfer for cyclic channels in issue_pending") 078a6506141a ("dmaengine: at_hdmac: Fix deadlocks")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From fcd37565efdaffeac179d0f0ce980ac79bfdf569 Mon Sep 17 00:00:00 2001
From: Tudor Ambarus <[email protected]>
Date: Tue, 25 Oct 2022 12:02:38 +0300
Subject: [PATCH] dmaengine: at_hdmac: Fix premature completion of desc in
issue_pending
Multiple calls to atc_issue_pending() could result in a premature completion of a descriptor from the atchan->active list, as the method always completed the first active descriptor from the list. Instead, issue_pending() should just take the first transaction descriptor from the pending queue, move it to active_list and start the transfer.
drivers/dma/at_hdmac.c +13 -3
@@ -1527,16 +1527,26 @@ atc_tx_status(struct dma_chan *chan, }/** -* atc_issue_pending - try to finish work +* atc_issue_pending - takes the first transaction descriptor in the pending +* queue and starts the transfer. * @chan: target DMA channel */ static void atc_issue_pending (struct dma_chan *chan) { -struct at_dma_chan *atchan =to_at_dma_chan (chan); +struct at_dma_chan *atchan =to_at_dma_chan (chan); +struct at_desc *desc; +unsigned long flags;dev_vdbg (chan2dev (chan),"issue_pending\n" ); -atc_advance_work (atchan); +spin_lock_irqsave (&atchan->lock, flags); +if (atc_chan_is_enabled (atchan) ||list_empty (&atchan->queue)) +return spin_unlock_irqrestore (&atchan->lock, flags); + + desc =atc_first_queued (atchan); +list_move_tail (&desc->desc_node, &atchan->active_list); +atc_dostart (atchan, desc); +spin_unlock_irqrestore (&atchan->lock, flags); }/**