提交 bf072af4 编写于 作者: R Russell King - ARM Linux 提交者: Dan Williams

ARM: PL08x: fix locking in tasklet

Tasklets are run from an interruptible context.  The slave DMA functions
can be called from within IRQ handlers.  Taking the spinlock without
disabling interrupts allows an interrupt handler to run, which may try
to take the spinlock again, resulting in deadlock.  Fix this by using
the irqsave spinlocks.
Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
Acked-by: NLinus Walleij <linus.walleij@stericsson.com>
Signed-off-by: NDan Williams <dan.j.williams@intel.com>
上级 91aa5fad
......@@ -1627,11 +1627,12 @@ static void pl08x_tasklet(unsigned long data)
struct pl08x_dma_chan *plchan = (struct pl08x_dma_chan *) data;
struct pl08x_phy_chan *phychan = plchan->phychan;
struct pl08x_driver_data *pl08x = plchan->host;
unsigned long flags;
if (!plchan)
BUG();
spin_lock(&plchan->lock);
spin_lock_irqsave(&plchan->lock, flags);
if (plchan->at) {
dma_async_tx_callback callback =
......@@ -1728,7 +1729,7 @@ static void pl08x_tasklet(unsigned long data)
}
}
spin_unlock(&plchan->lock);
spin_unlock_irqrestore(&plchan->lock, flags);
}
static irqreturn_t pl08x_irq(int irq, void *dev)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册