summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Osipenko <digetx@gmail.com>2020-02-09 19:33:39 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2020-03-11 18:03:04 +0100
commit3e4c735e6ba9a5add132c8bcad8700029fbdb609 (patch)
tree4ab4a632d47c2004ce85042718852bc01367c517
parent04b31630d500a14e64090470b7d5adf58b2be4fd (diff)
downloadlinux-3e4c735e6ba9a5add132c8bcad8700029fbdb609.tar.gz
linux-3e4c735e6ba9a5add132c8bcad8700029fbdb609.tar.bz2
linux-3e4c735e6ba9a5add132c8bcad8700029fbdb609.zip
dmaengine: tegra-apb: Prevent race conditions of tasklet vs free list
commit c33ee1301c393a241d6424e36eff1071811b1064 upstream. The interrupt handler puts a half-completed DMA descriptor on a free list and then schedules tasklet to process bottom half of the descriptor that executes client's callback, this creates possibility to pick up the busy descriptor from the free list. Thus, let's disallow descriptor's re-use until it is fully processed. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Acked-by: Jon Hunter <jonathanh@nvidia.com> Cc: <stable@vger.kernel.org> Link: https://lore.kernel.org/r/20200209163356.6439-3-digetx@gmail.com Signed-off-by: Vinod Koul <vkoul@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/dma/tegra20-apb-dma.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c
index ffe8126a9553..3402494cadf9 100644
--- a/drivers/dma/tegra20-apb-dma.c
+++ b/drivers/dma/tegra20-apb-dma.c
@@ -288,7 +288,7 @@ static struct tegra_dma_desc *tegra_dma_desc_get(
/* Do not allocate if desc are waiting for ack */
list_for_each_entry(dma_desc, &tdc->free_dma_desc, node) {
- if (async_tx_test_ack(&dma_desc->txd)) {
+ if (async_tx_test_ack(&dma_desc->txd) && !dma_desc->cb_count) {
list_del(&dma_desc->node);
spin_unlock_irqrestore(&tdc->lock, flags);
dma_desc->txd.flags = 0;