diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index a796ffcafb42..31b8ed6c31ca 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -1739,7 +1739,9 @@ static int pl330_submit_req(struct pl330_thread *thrd, if (!desc->last) { desc->status = FREE; + spin_lock(&pl330->pool_lock); list_move_tail(&desc->node, &pl330->desc_pool); + spin_unlock(&pl330->pool_lock); dev_dbg(pl330->ddma.dev, "desc-%px has been merged, drop it\n", desc); } @@ -2324,7 +2326,10 @@ static void pl330_tasklet(struct tasklet_struct *t) dmaengine_desc_get_callback(&desc->txd, &cb); desc->status = FREE; + + spin_lock(&pch->dmac->pool_lock); list_move_tail(&desc->node, &pch->dmac->desc_pool); + spin_unlock(&pch->dmac->pool_lock); dma_descriptor_unmap(&desc->txd); @@ -2542,9 +2547,12 @@ static int pl330_terminate_all(struct dma_chan *chan) dma_cookie_complete(&desc->txd); } + spin_lock(&pl330->pool_lock); list_splice_tail_init(&pch->submitted_list, &pl330->desc_pool); list_splice_tail_init(&pch->work_list, &pl330->desc_pool); list_splice_tail_init(&pch->completed_list, &pl330->desc_pool); + spin_unlock(&pl330->pool_lock); + spin_unlock_irqrestore(&pch->lock, flags); pm_runtime_mark_last_busy(pl330->ddma.dev); if (power_down) @@ -2600,7 +2608,9 @@ static void pl330_free_chan_resources(struct dma_chan *chan) pl330_release_channel(pch->thread); pch->thread = NULL; + spin_lock(&pl330->pool_lock); list_splice_tail_init(&pch->work_list, &pch->dmac->desc_pool); + spin_unlock(&pl330->pool_lock); spin_unlock_irqrestore(&pl330->lock, flags); pm_runtime_mark_last_busy(pch->dmac->ddma.dev);