[NETPOLL]: Fix TX queue overflow in trapped mode.
authorSergei Shtylyov <[email protected]>
Sun, 29 Apr 2007 03:57:37 +0000 (20:57 -0700)
committerDavid S. Miller <[email protected]>
Sun, 29 Apr 2007 03:57:37 +0000 (20:57 -0700)
CONFIG_NETPOLL_TRAP causes the TX queue controls to be completely bypassed in
the netpoll's "trapped" mode which easily causes overflows in the drivers with
short TX queues (most notably, in 8139too with its 4-deep queue).  So, make
this option more sensible by making it only bypass the TX softirq wakeup.

Signed-off-by: Sergei Shtylyov <[email protected]>
Acked-by: Jeff Garzik <[email protected]>
Acked-by: Tom Rini <[email protected]>
Acked-by: Matt Mackall <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
include/linux/netdevice.h

index e027a3750a7737dfa50937c9adf911863298ddfd..24cef42f1e0f1e6098934e6f7e59a684587232f4 100644 (file)
@@ -654,8 +654,10 @@ static inline void netif_start_queue(struct net_device *dev)
 static inline void netif_wake_queue(struct net_device *dev)
 {
 #ifdef CONFIG_NETPOLL_TRAP
-       if (netpoll_trap())
+       if (netpoll_trap()) {
+               clear_bit(__LINK_STATE_XOFF, &dev->state);
                return;
+       }
 #endif
        if (test_and_clear_bit(__LINK_STATE_XOFF, &dev->state))
                __netif_schedule(dev);
@@ -663,10 +665,6 @@ static inline void netif_wake_queue(struct net_device *dev)
 
 static inline void netif_stop_queue(struct net_device *dev)
 {
-#ifdef CONFIG_NETPOLL_TRAP
-       if (netpoll_trap())
-               return;
-#endif
        set_bit(__LINK_STATE_XOFF, &dev->state);
 }