提交 e99b1f04 编写于 作者: D Dongdong Deng 提交者: David S. Miller

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: NDongdong Deng <dongdong.deng@windriver.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 3933fc95
...@@ -847,23 +847,22 @@ static int b44_poll(struct napi_struct *napi, int budget) ...@@ -847,23 +847,22 @@ static int b44_poll(struct napi_struct *napi, int budget)
{ {
struct b44 *bp = container_of(napi, struct b44, napi); struct b44 *bp = container_of(napi, struct b44, napi);
int work_done; int work_done;
unsigned long flags;
spin_lock_irq(&bp->lock); spin_lock_irqsave(&bp->lock, flags);
if (bp->istat & (ISTAT_TX | ISTAT_TO)) { if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
/* spin_lock(&bp->tx_lock); */ /* spin_lock(&bp->tx_lock); */
b44_tx(bp); b44_tx(bp);
/* spin_unlock(&bp->tx_lock); */ /* spin_unlock(&bp->tx_lock); */
} }
spin_unlock_irq(&bp->lock); spin_unlock_irqrestore(&bp->lock, flags);
work_done = 0; work_done = 0;
if (bp->istat & ISTAT_RX) if (bp->istat & ISTAT_RX)
work_done += b44_rx(bp, budget); work_done += b44_rx(bp, budget);
if (bp->istat & ISTAT_ERRORS) { if (bp->istat & ISTAT_ERRORS) {
unsigned long flags;
spin_lock_irqsave(&bp->lock, flags); spin_lock_irqsave(&bp->lock, flags);
b44_halt(bp); b44_halt(bp);
b44_init_rings(bp); b44_init_rings(bp);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册