summaryrefslogtreecommitdiff
path: root/net/core
diff options
context:
space:
mode:
authorTommy S. Christensen <tommy.christensen@tpack.net>2005-05-03 23:18:52 (GMT)
committerDavid S. Miller <davem@davemloft.net>2005-05-03 23:18:52 (GMT)
commitcacaddf57ed4d5ca994e9a7e2bd5558061f5d89d (patch)
tree6e4c59a9a27441a3196cbc67a3a79356baa679fb /net/core
parent0f4821e7b93fe72e89b8ff393bd8e705bd178aa5 (diff)
downloadlinux-fsl-qoriq-cacaddf57ed4d5ca994e9a7e2bd5558061f5d89d.tar.xz
[NET]: Disable queueing when carrier is lost.
Some network drivers call netif_stop_queue() when detecting loss of carrier. This leads to packets being queued up at the qdisc level for an unbound period of time. In order to prevent this effect, the core networking stack will now cease to queue packets for any device, that is operationally down (i.e. the queue is flushed and disabled). Signed-off-by: Tommy S. Christensen <tommy.christensen@tpack.net> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/link_watch.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/net/core/link_watch.c b/net/core/link_watch.c
index 4859b74..d43d120 100644
--- a/net/core/link_watch.c
+++ b/net/core/link_watch.c
@@ -16,6 +16,7 @@
#include <linux/netdevice.h>
#include <linux/if.h>
#include <net/sock.h>
+#include <net/pkt_sched.h>
#include <linux/rtnetlink.h>
#include <linux/jiffies.h>
#include <linux/spinlock.h>
@@ -74,6 +75,12 @@ void linkwatch_run_queue(void)
clear_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state);
if (dev->flags & IFF_UP) {
+ if (netif_carrier_ok(dev)) {
+ WARN_ON(dev->qdisc_sleeping == &noop_qdisc);
+ dev_activate(dev);
+ } else
+ dev_deactivate(dev);
+
netdev_state_change(dev);
}