Skip to content

Commit

Permalink
ARM: PL08x: fix missed spin-unlock in pl08x_issue_pending()
Browse files Browse the repository at this point in the history
pl08x_issue_pending() returns with the spinlock locked and interrupts
disabled if the channel is waiting for a physical DMA to become free.
This is wrong - especially as pl08x_issue_pending() is an API function
as it leads to deadlocks.  Fix it to always return with the spinlock
unlocked.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Russell King - ARM Linux authored and Dan Williams committed Jan 5, 2011
1 parent dafa731 commit 9c0bb43
Showing 1 changed file with 4 additions and 8 deletions.
12 changes: 4 additions & 8 deletions drivers/dma/amba-pl08x.c
Original file line number Diff line number Diff line change
Expand Up @@ -1294,15 +1294,11 @@ static void pl08x_issue_pending(struct dma_chan *chan)
unsigned long flags;

spin_lock_irqsave(&plchan->lock, flags);
/* Something is already active */
if (plchan->at) {
spin_unlock_irqrestore(&plchan->lock, flags);
return;
}

/* Didn't get a physical channel so waiting for it ... */
if (plchan->state == PL08X_CHAN_WAITING)
/* Something is already active, or we're waiting for a channel... */
if (plchan->at || plchan->state == PL08X_CHAN_WAITING) {
spin_unlock_irqrestore(&plchan->lock, flags);
return;
}

/* Take the first element in the queue and execute it */
if (!list_empty(&plchan->desc_list)) {
Expand Down

0 comments on commit 9c0bb43

Please sign in to comment.