From 1b22940f269f9e14abd98e4e048b96b7b58e3e7b Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Fri, 28 Mar 2008 16:25:26 -0700 Subject: [PATCH] --- yaml --- r: 88013 b: refs/heads/master c: 2ba2506ca7ca62c56edaa334b0fe61eb5eab6ab0 h: refs/heads/master i: 88011: a5df6fcb41d9bdd4d8531e9a489b173c6cd1d8a6 v: v3 --- [refs] | 2 +- trunk/net/sched/sch_generic.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 34242428ff37..c255063aae5b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 32aced7509cb20ef3ec67c9b56f5b55c41dd4f8d +refs/heads/master: 2ba2506ca7ca62c56edaa334b0fe61eb5eab6ab0 diff --git a/trunk/net/sched/sch_generic.c b/trunk/net/sched/sch_generic.c index 10b5c0887fff..b741618e4d54 100644 --- a/trunk/net/sched/sch_generic.c +++ b/trunk/net/sched/sch_generic.c @@ -184,10 +184,22 @@ static inline int qdisc_restart(struct net_device *dev) void __qdisc_run(struct net_device *dev) { - do { - if (!qdisc_restart(dev)) + unsigned long start_time = jiffies; + + while (qdisc_restart(dev)) { + if (netif_queue_stopped(dev)) + break; + + /* + * Postpone processing if + * 1. another process needs the CPU; + * 2. we've been doing it for too long. + */ + if (need_resched() || jiffies != start_time) { + netif_schedule(dev); break; - } while (!netif_queue_stopped(dev)); + } + } clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state); }