summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-03-07 06:06:29 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-04-28 13:41:50 +0200
commitc37076738ff4080d49b2dd01402e3aff5d130614 (patch)
tree5ef0db21cfcd4478d28718c782e637cbf88e2444
parentcea1e229a5fab9a3e201385735fce01992dac4ac (diff)
downloadlinux-c37076738ff4080d49b2dd01402e3aff5d130614.tar.gz
linux-c37076738ff4080d49b2dd01402e3aff5d130614.tar.bz2
linux-c37076738ff4080d49b2dd01402e3aff5d130614.zip
dmaengine: xilinx: dpdma: Fix race condition in done IRQ
[ Upstream commit 868833fbffbe51c487df4f95d4de9194264a4b30 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/dma/xilinx/xilinx_dpdma.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/dma/xilinx/xilinx_dpdma.c b/drivers/dma/xilinx/xilinx_dpdma.c
index d504112c609e..70b29bd079c9 100644
--- a/drivers/dma/xilinx/xilinx_dpdma.c
+++ b/drivers/dma/xilinx/xilinx_dpdma.c
@@ -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