提交 e4d8817c 编写于 作者: P Peter Ujfalusi 提交者: Vinod Koul

dmaengine: edma: Fetch echan->edesc while holding lock in edma_comletion_handler

In order to avoid possible race condition when client drivers are using
dmaengine_terminate_sync() call to disable the channel.
Signed-off-by: NPeter Ujfalusi <peter.ujfalusi@ti.com>
Suggested-by: NLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: NVinod Koul <vinod.koul@intel.com>
上级 b84730ff
......@@ -1369,12 +1369,11 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
static void edma_completion_handler(struct edma_chan *echan)
{
struct device *dev = echan->vchan.chan.device->dev;
struct edma_desc *edesc = echan->edesc;
if (!edesc)
return;
struct edma_desc *edesc;
spin_lock(&echan->vchan.lock);
edesc = echan->edesc;
if (edesc) {
if (edesc->cyclic) {
vchan_cyclic_callback(&edesc->vdesc);
spin_unlock(&echan->vchan.lock);
......@@ -1399,6 +1398,7 @@ static void edma_completion_handler(struct edma_chan *echan)
edesc->processed_stat = edesc->processed;
}
edma_execute(echan);
}
spin_unlock(&echan->vchan.lock);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册