lkml.org 
[lkml]   [2020]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 54/86] dmaengine: tegra-apb: Prevent race conditions of tasklet vs free list
    Date
    From: Dmitry Osipenko <digetx@gmail.com>

    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>

    ---
    drivers/dma/tegra20-apb-dma.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- 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_

    /* 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;

    \
     
     \ /
      Last update: 2020-03-10 14:14    [W:4.168 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site