diff options
author | WANG Cong <xiyou.wangcong@gmail.com> | 2016-02-25 23:55:01 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-02-29 23:02:33 +0100 |
commit | 2ccccf5fb43ff62b2b96cc58d95fc0b3596516e4 (patch) | |
tree | d73ec90b0c0cfd1191ef35a4aa0eaea78af1f100 /net/sched/sch_multiq.c | |
parent | net_sched: introduce qdisc_replace() helper (diff) | |
download | linux-2ccccf5fb43ff62b2b96cc58d95fc0b3596516e4.tar.xz linux-2ccccf5fb43ff62b2b96cc58d95fc0b3596516e4.zip |
net_sched: update hierarchical backlog too
When the bottom qdisc decides to, for example, drop some packet,
it calls qdisc_tree_decrease_qlen() to update the queue length
for all its ancestors, we need to update the backlog too to
keep the stats on root qdisc accurate.
Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_multiq.c')
-rw-r--r-- | net/sched/sch_multiq.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c index a0103a138563..bcdd54bb101c 100644 --- a/net/sched/sch_multiq.c +++ b/net/sched/sch_multiq.c @@ -218,7 +218,8 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) if (q->queues[i] != &noop_qdisc) { struct Qdisc *child = q->queues[i]; q->queues[i] = &noop_qdisc; - qdisc_tree_decrease_qlen(child, child->q.qlen); + qdisc_tree_reduce_backlog(child, child->q.qlen, + child->qstats.backlog); qdisc_destroy(child); } } @@ -238,8 +239,9 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt) q->queues[i] = child; if (old != &noop_qdisc) { - qdisc_tree_decrease_qlen(old, - old->q.qlen); + qdisc_tree_reduce_backlog(old, + old->q.qlen, + old->qstats.backlog); qdisc_destroy(old); } sch_tree_unlock(sch); |