Skip to content

Commit

Permalink
b44: the poll handler b44_poll must not enable IRQ unconditionally
Browse files Browse the repository at this point in the history
net/core/netpoll.c::netpoll_send_skb() calls the poll handler when
it is available. As netconsole can be used from almost any context,
IRQ must not be enabled blindly in the NAPI handler of the driver
which supports netpoll.

Call trace:
netpoll_send_skb()
{
local_irq_save(flags)
  -> netpoll_poll()
    -> poll_napi()
      -> poll_one_napi()
        -> napi->poll()
            -> b44_poll()
local_irq_restore(flags)
}

Signed-off-by: Dongdong Deng <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Dongdong Deng authored and davem330 committed Sep 17, 2009
1 parent 3933fc9 commit e99b1f0
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions drivers/net/b44.c
Original file line number Diff line number Diff line change
Expand Up @@ -847,23 +847,22 @@ static int b44_poll(struct napi_struct *napi, int budget)
{
struct b44 *bp = container_of(napi, struct b44, napi);
int work_done;
unsigned long flags;

spin_lock_irq(&bp->lock);
spin_lock_irqsave(&bp->lock, flags);

if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
/* spin_lock(&bp->tx_lock); */
b44_tx(bp);
/* spin_unlock(&bp->tx_lock); */
}
spin_unlock_irq(&bp->lock);
spin_unlock_irqrestore(&bp->lock, flags);

work_done = 0;
if (bp->istat & ISTAT_RX)
work_done += b44_rx(bp, budget);

if (bp->istat & ISTAT_ERRORS) {
unsigned long flags;

spin_lock_irqsave(&bp->lock, flags);
b44_halt(bp);
b44_init_rings(bp);
Expand Down

0 comments on commit e99b1f0

Please sign in to comment.