[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>
This commit is contained in:
parent
11274e5a43
commit
1936502d00
@ -296,10 +296,16 @@ static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer)
|
|||||||
{
|
{
|
||||||
struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog,
|
struct qdisc_watchdog *wd = container_of(timer, struct qdisc_watchdog,
|
||||||
timer);
|
timer);
|
||||||
|
struct net_device *dev = wd->qdisc->dev;
|
||||||
|
|
||||||
wd->qdisc->flags &= ~TCQ_F_THROTTLED;
|
wd->qdisc->flags &= ~TCQ_F_THROTTLED;
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
netif_schedule(wd->qdisc->dev);
|
if (spin_trylock(&dev->queue_lock)) {
|
||||||
|
qdisc_run(dev);
|
||||||
|
spin_unlock(&dev->queue_lock);
|
||||||
|
} else
|
||||||
|
netif_schedule(dev);
|
||||||
|
|
||||||
return HRTIMER_NORESTART;
|
return HRTIMER_NORESTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user