diff options
author | Eric Dumazet <edumazet@google.com> | 2013-10-07 08:32:32 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-08 16:27:33 -0400 |
commit | 2c8c8e6f9d534a77f97df4d7148561cb902c0f83 (patch) | |
tree | 4b48a1db1f650dde62573063ae2ab83f1855e3d5 /net/sched/sch_api.c | |
parent | 4996b9098d5522f9d3233af6a7efd1fac5d43f00 (diff) | |
download | op-kernel-dev-2c8c8e6f9d534a77f97df4d7148561cb902c0f83.zip op-kernel-dev-2c8c8e6f9d534a77f97df4d7148561cb902c0f83.tar.gz |
net_sched: increment drop counters in qdisc_tree_decrease_qlen()
qdisc_tree_decrease_qlen() is called when some packets are dropped
on a qdisc, and we want to notify parents of qlen changes.
We also can increment parents qdisc qstats drop counters.
This permits more accurate drop counters up to root qdisc.
For example a graft operation typically resets a qdisc
(drops all packets) and call qdisc_tree_decrease_qlen()
Note that callers are responsible for their drop counters.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_api.c')
-rw-r--r-- | net/sched/sch_api.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 2adda7f..cd81505 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c @@ -737,9 +737,11 @@ void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n) const struct Qdisc_class_ops *cops; unsigned long cl; u32 parentid; + int drops; if (n == 0) return; + drops = max_t(int, n, 0); while ((parentid = sch->parent)) { if (TC_H_MAJ(parentid) == TC_H_MAJ(TC_H_INGRESS)) return; @@ -756,6 +758,7 @@ void qdisc_tree_decrease_qlen(struct Qdisc *sch, unsigned int n) cops->put(sch, cl); } sch->q.qlen -= n; + sch->qstats.drops += drops; } } EXPORT_SYMBOL(qdisc_tree_decrease_qlen); |