aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_api.c
diff options
context:
space:
mode:
authorStephen Hemminger <shemminger@linux-foundation.org>2007-03-22 15:18:35 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-04-26 01:27:23 -0400
commit1936502d00ae6c2aa3931c42f6cf54afaba094f2 (patch)
tree2870f51b8b5a91c39295fe092dd042b774825bf4 /net/sched/sch_api.c
parent11274e5a43266d531140530adebead6903380caf (diff)
[NET_SCHED] qdisc: avoid transmit softirq on watchdog wakeup
If possible, avoid having to do a transmit softirq when a qdisc watchdog decides to re-enable. The watchdog routine runs off a timer, so it is already in the same effective context as the softirq. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_api.c')
-rw-r--r--net/sched/sch_api.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index fcaa4adefc82..58732509160d 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -296,10 +296,16 @@ static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer)
296{ 296{
297 struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog, 297 struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog,
298 timer); 298 timer);
299 struct net_device *dev = wd->qdisc->dev;
299 300
300 wd->qdisc->flags &= ~TCQ_F_THROTTLED; 301 wd->qdisc->flags &= ~TCQ_F_THROTTLED;
301 smp_wmb(); 302 smp_wmb();
302 netif_schedule(wd->qdisc->dev); 303 if (spin_trylock(&dev->queue_lock)) {
304 qdisc_run(dev);
305 spin_unlock(&dev->queue_lock);
306 } else
307 netif_schedule(dev);
308
303 return HRTIMER_NORESTART; 309 return HRTIMER_NORESTART;
304} 310}
305 311