[NETPOLL]: Fix local_bh_enable() warning.
authorAndrew Morton <akpm@osdl.org>
Tue, 12 Dec 2006 01:24:46 +0000 (17:24 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 12 Dec 2006 01:24:46 +0000 (17:24 -0800)
During boot we get:

netconsole: device eth0 not up yet, forcing it
e1000: eth0: e1000_watchdog: NIC Link is Up 100 Mbps Full Duplex
WARNING (!__warned) at kernel/softirq.c:137 local_bh_enable()

Call Trace:
 [<ffffffff80235baf>] local_bh_enable+0x41/0xa3
 [<ffffffff8045ab8e>] netpoll_send_skb+0x116/0x144
 [<ffffffff8045b1ee>] netpoll_send_udp+0x263/0x271
 [<ffffffff803d41ec>] write_msg+0x42/0x5e
 [<ffffffff80230c9b>] __call_console_drivers+0x5f/0x70
 [<ffffffff80230d19>] _call_console_drivers+0x6d/0x71
 [<ffffffff802313f0>] release_console_sem+0x148/0x1ec
 [<ffffffff802316ce>] register_console+0x1b1/0x1ba
 [<ffffffff803d4178>] init_netconsole+0x54/0x68
 [<ffffffff802071ae>] init+0x152/0x308
 [<ffffffff804dac8b>] _spin_unlock_irq+0x14/0x30
 [<ffffffff8022c15e>] schedule_tail+0x43/0x9f
 [<ffffffff8020a758>] child_rip+0xa/0x12

Herbert sayeth:

  Normally networking isn't invoked with interrupts turned off, but I
  suppose we don't have a choice here.  This is unique being a place where you
  can get called with BH on, off, or IRQs off.

  Given that this is only used for printk, the easiest solution is probably
  just to disable local IRQs instead of BH.

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/netpoll.c

index 156d7fd..a01abdd 100644 (file)
@@ -243,7 +243,9 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
        /* don't get messages out of order, and no recursion */
        if (skb_queue_len(&npinfo->txq) == 0 &&
                    npinfo->poll_owner != smp_processor_id()) {
-               local_bh_disable();     /* Where's netif_tx_trylock_bh()? */
+               unsigned long flags;
+
+               local_irq_save(flags);
                if (netif_tx_trylock(dev)) {
                        /* try until next clock tick */
                        for (tries = jiffies_to_usecs(1)/USEC_PER_POLL;
@@ -261,7 +263,7 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
                        }
                        netif_tx_unlock(dev);
                }
-               local_bh_enable();
+               local_irq_restore(flags);
        }
 
        if (status != NETDEV_TX_OK) {