diff options
author | Stephen Hemminger <shemminger@linux-foundation.org> | 2007-03-22 15:18:35 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-26 01:27:23 -0400 |
commit | 1936502d00ae6c2aa3931c42f6cf54afaba094f2 (patch) | |
tree | 2870f51b8b5a91c39295fe092dd042b774825bf4 /net | |
parent | 11274e5a43266d531140530adebead6903380caf (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')
-rw-r--r-- | net/sched/sch_api.c | 8 |
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 | ||