pkt_sched: Never schedule non-root qdiscs.
authorDavid S. Miller <davem@davemloft.net>
Tue, 19 Aug 2008 03:51:18 +0000 (20:51 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Aug 2008 04:05:56 +0000 (21:05 -0700)
Based upon initial discovery and patch by Jarek Poplawski.

The qdisc watchdogs can be attached to any qdisc, not just the root,
so make sure we schedule the correct one.

CBQ has a similar bug.

Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_api.c
net/sched/sch_cbq.c

index c8dc72e12107a8ac1d2aefd498c84a12ad3e3dec..98c00847a3d22d69f97abff267b1c1b43610affa 100644 (file)
@@ -426,7 +426,7 @@ static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer)
 
        wd->qdisc->flags &= ~TCQ_F_THROTTLED;
        smp_wmb();
-       __netif_schedule(wd->qdisc);
+       __netif_schedule(qdisc_root(wd->qdisc));
 
        return HRTIMER_NORESTART;
 }
index 4e261ce62f48071dc3a0569cbfd0d5915a9577dc..47ef492c4ff40ad23735aa6254885b503e094e2f 100644 (file)
@@ -654,7 +654,7 @@ static enum hrtimer_restart cbq_undelay(struct hrtimer *timer)
        }
 
        sch->flags &= ~TCQ_F_THROTTLED;
-       __netif_schedule(sch);
+       __netif_schedule(qdisc_root(sch));
        return HRTIMER_NORESTART;
 }