On Wed, 2017-09-13 at 10:58 -0700, Eric Dumazet wrote: > On Wed, 2017-09-13 at 20:35 +0300, Denys Fedoryshchenko wrote: > > > Overlimits never appear in HTB as i know, here is simulation on this > > class that have constant "at least" 1G traffic, i throttled it to 1Kbit > > to simulate forced drops: > > > > shapernew ~ # sh /etc/shaper.cfg;sleep 1;tc -s -d class show dev > > eth3.777 classid 1:111;tc qdisc del dev eth3.777 root > > class htb 1:111 parent 1:1 leaf 111: prio 0 quantum 50000 rate 1Kbit > > ceil 1Kbit linklayer ethernet burst 31280b/1 mpu 0b cburst 31280b/1 mpu > > 0b level 0 > > Sent 134350019 bytes 117520 pkt (dropped 7819, overlimits 0 requeues 0) > > backlog 7902126b 4976p requeues 0 > > lended: 86694 borrowed: 0 giants: 0 > > tokens: -937500000 ctokens: -937500000 > > > > Oh right, I am using a local patch for this. Time to upstream :/
Please try : diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 7e148376ba528efabe5a53a09653f9161c264be7..c6d7ae81b41f4e277afb93a3003fefcd3f27de35 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -142,6 +142,7 @@ struct htb_class { struct rb_node node[TC_HTB_NUMPRIO]; /* node for self or feed tree */ unsigned int drops ____cacheline_aligned_in_smp; + unsigned int overlimits; }; struct htb_level { @@ -533,6 +534,9 @@ htb_change_class_mode(struct htb_sched *q, struct htb_class *cl, s64 *diff) if (new_mode == cl->cmode) return; + if (new_mode == HTB_CANT_SEND) + cl->overlimits++; + if (cl->prio_activity) { /* not necessary: speed optimization */ if (cl->cmode != HTB_CANT_SEND) htb_deactivate_prios(q, cl); @@ -1143,6 +1147,7 @@ htb_dump_class_stats(struct Qdisc *sch, unsigned long arg, struct gnet_dump *d) struct htb_class *cl = (struct htb_class *)arg; struct gnet_stats_queue qs = { .drops = cl->drops, + .overlimits = cl->overlimits, }; __u32 qlen = 0;