b44: the poll handler b44_poll must not enable IRQ unconditionally
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 <dongdong.deng@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3933fc952a
commit
e99b1f04d9
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue