Skip to content

Commit

Permalink
dmaengine: xilinx: dpdma: Fix race condition in done IRQ
Browse files Browse the repository at this point in the history
The active descriptor pointer is accessed from different contexts,
including different interrupt handlers, and its access must be protected
by the channel's lock. This wasn't done in the done IRQ handler. Fix it.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Link: https://lore.kernel.org/r/20210307040629.29308-3-laurent.pinchart@ideasonboard.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
  • Loading branch information
pinchartl authored and vinodkoul committed Mar 16, 2021
1 parent 1cbd446 commit 868833f
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion drivers/dma/xilinx/xilinx_dpdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -1048,13 +1048,14 @@ static int xilinx_dpdma_chan_stop(struct xilinx_dpdma_chan *chan)
*/
static void xilinx_dpdma_chan_done_irq(struct xilinx_dpdma_chan *chan)
{
struct xilinx_dpdma_tx_desc *active = chan->desc.active;
struct xilinx_dpdma_tx_desc *active;
unsigned long flags;

spin_lock_irqsave(&chan->lock, flags);

xilinx_dpdma_debugfs_desc_done_irq(chan);

active = chan->desc.active;
if (active)
vchan_cyclic_callback(&active->vdesc);
else
Expand Down

0 comments on commit 868833f

Please sign in to comment.