FAILED: patch "[PATCH] dmaengine: at_xdmac: Fix concurrency over xfers_list" failed to apply to 4.9-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.9-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]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 18deddea9184b62941395889ff7659529c877326 Mon Sep 17 00:00:00 2001
From: Tudor Ambarus <[email protected]>
Date: Wed, 15 Dec 2021 13:01:10 +0200
Subject: [PATCH] dmaengine: at_xdmac: Fix concurrency over xfers_list
Since tx_submit can be called from a hard IRQ, xfers_list must be protected with a lock to avoid concurency on the list's elements. Since at_xdmac_handle_cyclic() is called from a tasklet, spin_lock_irq is enough to protect from a hard IRQ.
drivers/dma/at_xdmac.c +10 -7
@@ -1608,14 +1608,17 @@ static void at_xdmac_handle_cyclic(struct at_xdmac_chan *atchan)struct at_xdmac_desc *desc;struct dma_async_tx_descriptor *txd; -if (!list_empty (&atchan->xfers_list)) { - desc =list_first_entry (&atchan->xfers_list, - struct at_xdmac_desc, xfer_node); - txd = &desc->tx_dma_desc; - -if (txd->flags &DMA_PREP_INTERRUPT ) -dmaengine_desc_get_callback_invoke (txd,NULL ); +spin_lock_irq (&atchan->lock); +if (list_empty (&atchan->xfers_list)) { +spin_unlock_irq (&atchan->lock); +return ; } + desc = list_first_entry(&atchan->xfers_list, struct at_xdmac_desc, + xfer_node); +spin_unlock_irq (&atchan->lock); + txd = &desc->tx_dma_desc; +if (txd->flags &DMA_PREP_INTERRUPT ) +dmaengine_desc_get_callback_invoke (txd,NULL ); }static void at_xdmac_handle_error (struct at_xdmac_chan *atchan)