Skip to content

Commit

Permalink
ARM: PL08x: fix locking in tasklet
Browse files Browse the repository at this point in the history
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: 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 91aa5fa commit bf072af
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/dma/amba-pl08x.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit bf072af

Please sign in to comment.