]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - net/sched/sch_cbq.c
net_sched: call qlen_notify only if child qdisc is empty
[mirror_ubuntu-bionic-kernel.git] / net / sched / sch_cbq.c
CommitLineData
1da177e4
LT
1/*
2 * net/sched/sch_cbq.c Class-Based Queueing discipline.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 *
9 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
10 *
11 */
12
1da177e4 13#include <linux/module.h>
5a0e3ad6 14#include <linux/slab.h>
1da177e4
LT
15#include <linux/types.h>
16#include <linux/kernel.h>
1da177e4 17#include <linux/string.h>
1da177e4 18#include <linux/errno.h>
1da177e4 19#include <linux/skbuff.h>
0ba48053 20#include <net/netlink.h>
1da177e4 21#include <net/pkt_sched.h>
cf1facda 22#include <net/pkt_cls.h>
1da177e4
LT
23
24
25/* Class-Based Queueing (CBQ) algorithm.
26 =======================================
27
28 Sources: [1] Sally Floyd and Van Jacobson, "Link-sharing and Resource
10297b99 29 Management Models for Packet Networks",
1da177e4
LT
30 IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
31
10297b99 32 [2] Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
1da177e4 33
10297b99 34 [3] Sally Floyd, "Notes on Class-Based Queueing: Setting
1da177e4
LT
35 Parameters", 1996
36
37 [4] Sally Floyd and Michael Speer, "Experimental Results
38 for Class-Based Queueing", 1998, not published.
39
40 -----------------------------------------------------------------------
41
42 Algorithm skeleton was taken from NS simulator cbq.cc.
43 If someone wants to check this code against the LBL version,
44 he should take into account that ONLY the skeleton was borrowed,
45 the implementation is different. Particularly:
46
47 --- The WRR algorithm is different. Our version looks more
10297b99
YH
48 reasonable (I hope) and works when quanta are allowed to be
49 less than MTU, which is always the case when real time classes
50 have small rates. Note, that the statement of [3] is
51 incomplete, delay may actually be estimated even if class
52 per-round allotment is less than MTU. Namely, if per-round
53 allotment is W*r_i, and r_1+...+r_k = r < 1
1da177e4
LT
54
55 delay_i <= ([MTU/(W*r_i)]*W*r + W*r + k*MTU)/B
56
57 In the worst case we have IntServ estimate with D = W*r+k*MTU
58 and C = MTU*r. The proof (if correct at all) is trivial.
59
60
61 --- It seems that cbq-2.0 is not very accurate. At least, I cannot
62 interpret some places, which look like wrong translations
63 from NS. Anyone is advised to find these differences
64 and explain to me, why I am wrong 8).
65
66 --- Linux has no EOI event, so that we cannot estimate true class
67 idle time. Workaround is to consider the next dequeue event
68 as sign that previous packet is finished. This is wrong because of
69 internal device queueing, but on a permanently loaded link it is true.
70 Moreover, combined with clock integrator, this scheme looks
71 very close to an ideal solution. */
72
73struct cbq_sched_data;
74
75
cc7ec456 76struct cbq_class {
d77fea2e 77 struct Qdisc_class_common common;
1da177e4
LT
78 struct cbq_class *next_alive; /* next class with backlog in this priority band */
79
80/* Parameters */
1da177e4
LT
81 unsigned char priority; /* class priority */
82 unsigned char priority2; /* priority to be used after overlimit */
83 unsigned char ewma_log; /* time constant for idle time calculation */
1da177e4
LT
84
85 u32 defmap;
86
87 /* Link-sharing scheduler parameters */
88 long maxidle; /* Class parameters: see below. */
89 long offtime;
90 long minidle;
91 u32 avpkt;
92 struct qdisc_rate_table *R_tab;
93
1da177e4
LT
94 /* General scheduler (WRR) parameters */
95 long allot;
96 long quantum; /* Allotment per WRR round */
97 long weight; /* Relative allotment: see below */
98
99 struct Qdisc *qdisc; /* Ptr to CBQ discipline */
100 struct cbq_class *split; /* Ptr to split node */
101 struct cbq_class *share; /* Ptr to LS parent in the class tree */
102 struct cbq_class *tparent; /* Ptr to tree parent in the class tree */
103 struct cbq_class *borrow; /* NULL if class is bandwidth limited;
104 parent otherwise */
105 struct cbq_class *sibling; /* Sibling chain */
106 struct cbq_class *children; /* Pointer to children chain */
107
108 struct Qdisc *q; /* Elementary queueing discipline */
109
110
111/* Variables */
112 unsigned char cpriority; /* Effective priority */
113 unsigned char delayed;
114 unsigned char level; /* level of the class in hierarchy:
115 0 for leaf classes, and maximal
116 level of children + 1 for nodes.
117 */
118
119 psched_time_t last; /* Last end of service */
120 psched_time_t undertime;
121 long avgidle;
122 long deficit; /* Saved deficit for WRR */
1a13cb63 123 psched_time_t penalized;
c1a8f1f1 124 struct gnet_stats_basic_packed bstats;
1da177e4 125 struct gnet_stats_queue qstats;
1c0d32fd 126 struct net_rate_estimator __rcu *rate_est;
1da177e4
LT
127 struct tc_cbq_xstats xstats;
128
25d8c0d5 129 struct tcf_proto __rcu *filter_list;
6529eaba 130 struct tcf_block *block;
1da177e4
LT
131
132 int refcnt;
133 int filters;
134
cc7ec456 135 struct cbq_class *defaults[TC_PRIO_MAX + 1];
1da177e4
LT
136};
137
cc7ec456 138struct cbq_sched_data {
d77fea2e 139 struct Qdisc_class_hash clhash; /* Hash table of all classes */
cc7ec456
ED
140 int nclasses[TC_CBQ_MAXPRIO + 1];
141 unsigned int quanta[TC_CBQ_MAXPRIO + 1];
1da177e4
LT
142
143 struct cbq_class link;
144
cc7ec456
ED
145 unsigned int activemask;
146 struct cbq_class *active[TC_CBQ_MAXPRIO + 1]; /* List of all classes
1da177e4
LT
147 with backlog */
148
c3bc7cff 149#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
150 struct cbq_class *rx_class;
151#endif
152 struct cbq_class *tx_class;
153 struct cbq_class *tx_borrowed;
154 int tx_len;
155 psched_time_t now; /* Cached timestamp */
cc7ec456 156 unsigned int pmask;
1da177e4 157
2fbd3da3 158 struct hrtimer delay_timer;
88a99354 159 struct qdisc_watchdog watchdog; /* Watchdog timer,
1da177e4
LT
160 started when CBQ has
161 backlog, but cannot
162 transmit just now */
88a99354 163 psched_tdiff_t wd_expires;
1da177e4
LT
164 int toplevel;
165 u32 hgenerator;
166};
167
168
cc7ec456 169#define L2T(cl, len) qdisc_l2t((cl)->R_tab, len)
1da177e4 170
cc7ec456 171static inline struct cbq_class *
1da177e4
LT
172cbq_class_lookup(struct cbq_sched_data *q, u32 classid)
173{
d77fea2e 174 struct Qdisc_class_common *clc;
1da177e4 175
d77fea2e
PM
176 clc = qdisc_class_find(&q->clhash, classid);
177 if (clc == NULL)
178 return NULL;
179 return container_of(clc, struct cbq_class, common);
1da177e4
LT
180}
181
c3bc7cff 182#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
183
184static struct cbq_class *
185cbq_reclassify(struct sk_buff *skb, struct cbq_class *this)
186{
cc7ec456 187 struct cbq_class *cl;
1da177e4 188
cc7ec456
ED
189 for (cl = this->tparent; cl; cl = cl->tparent) {
190 struct cbq_class *new = cl->defaults[TC_PRIO_BESTEFFORT];
1da177e4 191
cc7ec456
ED
192 if (new != NULL && new != this)
193 return new;
194 }
1da177e4
LT
195 return NULL;
196}
197
198#endif
199
200/* Classify packet. The procedure is pretty complicated, but
cc7ec456
ED
201 * it allows us to combine link sharing and priority scheduling
202 * transparently.
203 *
204 * Namely, you can put link sharing rules (f.e. route based) at root of CBQ,
205 * so that it resolves to split nodes. Then packets are classified
206 * by logical priority, or a more specific classifier may be attached
207 * to the split node.
1da177e4
LT
208 */
209
210static struct cbq_class *
211cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
212{
213 struct cbq_sched_data *q = qdisc_priv(sch);
214 struct cbq_class *head = &q->link;
215 struct cbq_class **defmap;
216 struct cbq_class *cl = NULL;
217 u32 prio = skb->priority;
25d8c0d5 218 struct tcf_proto *fl;
1da177e4
LT
219 struct tcf_result res;
220
221 /*
222 * Step 1. If skb->priority points to one of our classes, use it.
223 */
cc7ec456 224 if (TC_H_MAJ(prio ^ sch->handle) == 0 &&
1da177e4
LT
225 (cl = cbq_class_lookup(q, prio)) != NULL)
226 return cl;
227
c27f339a 228 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
1da177e4
LT
229 for (;;) {
230 int result = 0;
231 defmap = head->defaults;
232
25d8c0d5 233 fl = rcu_dereference_bh(head->filter_list);
1da177e4
LT
234 /*
235 * Step 2+n. Apply classifier.
236 */
87d83093 237 result = tcf_classify(skb, fl, &res, true);
25d8c0d5 238 if (!fl || result < 0)
1da177e4
LT
239 goto fallback;
240
cc7ec456
ED
241 cl = (void *)res.class;
242 if (!cl) {
1da177e4
LT
243 if (TC_H_MAJ(res.classid))
244 cl = cbq_class_lookup(q, res.classid);
cc7ec456 245 else if ((cl = defmap[res.classid & TC_PRIO_MAX]) == NULL)
1da177e4
LT
246 cl = defmap[TC_PRIO_BESTEFFORT];
247
bdfc87f7 248 if (cl == NULL)
1da177e4
LT
249 goto fallback;
250 }
bdfc87f7
ED
251 if (cl->level >= head->level)
252 goto fallback;
1da177e4
LT
253#ifdef CONFIG_NET_CLS_ACT
254 switch (result) {
255 case TC_ACT_QUEUED:
10297b99 256 case TC_ACT_STOLEN:
e25ea21f 257 case TC_ACT_TRAP:
378a2f09 258 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
1da177e4
LT
259 case TC_ACT_SHOT:
260 return NULL;
73ca4918
PM
261 case TC_ACT_RECLASSIFY:
262 return cbq_reclassify(skb, cl);
1da177e4 263 }
1da177e4
LT
264#endif
265 if (cl->level == 0)
266 return cl;
267
268 /*
269 * Step 3+n. If classifier selected a link sharing class,
270 * apply agency specific classifier.
271 * Repeat this procdure until we hit a leaf node.
272 */
273 head = cl;
274 }
275
276fallback:
277 cl = head;
278
279 /*
280 * Step 4. No success...
281 */
282 if (TC_H_MAJ(prio) == 0 &&
cc7ec456 283 !(cl = head->defaults[prio & TC_PRIO_MAX]) &&
1da177e4
LT
284 !(cl = head->defaults[TC_PRIO_BESTEFFORT]))
285 return head;
286
287 return cl;
288}
289
290/*
cc7ec456
ED
291 * A packet has just been enqueued on the empty class.
292 * cbq_activate_class adds it to the tail of active class list
293 * of its priority band.
1da177e4
LT
294 */
295
cc7ec456 296static inline void cbq_activate_class(struct cbq_class *cl)
1da177e4
LT
297{
298 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
299 int prio = cl->cpriority;
300 struct cbq_class *cl_tail;
301
302 cl_tail = q->active[prio];
303 q->active[prio] = cl;
304
305 if (cl_tail != NULL) {
306 cl->next_alive = cl_tail->next_alive;
307 cl_tail->next_alive = cl;
308 } else {
309 cl->next_alive = cl;
310 q->activemask |= (1<<prio);
311 }
312}
313
314/*
cc7ec456
ED
315 * Unlink class from active chain.
316 * Note that this same procedure is done directly in cbq_dequeue*
317 * during round-robin procedure.
1da177e4
LT
318 */
319
320static void cbq_deactivate_class(struct cbq_class *this)
321{
322 struct cbq_sched_data *q = qdisc_priv(this->qdisc);
323 int prio = this->cpriority;
324 struct cbq_class *cl;
325 struct cbq_class *cl_prev = q->active[prio];
326
327 do {
328 cl = cl_prev->next_alive;
329 if (cl == this) {
330 cl_prev->next_alive = cl->next_alive;
331 cl->next_alive = NULL;
332
333 if (cl == q->active[prio]) {
334 q->active[prio] = cl_prev;
335 if (cl == q->active[prio]) {
336 q->active[prio] = NULL;
337 q->activemask &= ~(1<<prio);
338 return;
339 }
340 }
1da177e4
LT
341 return;
342 }
343 } while ((cl_prev = cl) != q->active[prio]);
344}
345
346static void
347cbq_mark_toplevel(struct cbq_sched_data *q, struct cbq_class *cl)
348{
349 int toplevel = q->toplevel;
350
cca605dd 351 if (toplevel > cl->level) {
7201c1dd 352 psched_time_t now = psched_get_time();
1da177e4
LT
353
354 do {
104e0878 355 if (cl->undertime < now) {
1da177e4
LT
356 q->toplevel = cl->level;
357 return;
358 }
cc7ec456 359 } while ((cl = cl->borrow) != NULL && toplevel > cl->level);
1da177e4
LT
360 }
361}
362
363static int
520ac30f
ED
364cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
365 struct sk_buff **to_free)
1da177e4
LT
366{
367 struct cbq_sched_data *q = qdisc_priv(sch);
ddeee3ce 368 int uninitialized_var(ret);
1da177e4
LT
369 struct cbq_class *cl = cbq_classify(skb, sch, &ret);
370
c3bc7cff 371#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
372 q->rx_class = cl;
373#endif
374 if (cl == NULL) {
c27f339a 375 if (ret & __NET_XMIT_BYPASS)
25331d6c 376 qdisc_qstats_drop(sch);
520ac30f 377 __qdisc_drop(skb, to_free);
1da177e4
LT
378 return ret;
379 }
380
520ac30f 381 ret = qdisc_enqueue(skb, cl->q, to_free);
5f86173b 382 if (ret == NET_XMIT_SUCCESS) {
1da177e4 383 sch->q.qlen++;
1da177e4
LT
384 cbq_mark_toplevel(q, cl);
385 if (!cl->next_alive)
386 cbq_activate_class(cl);
387 return ret;
388 }
389
378a2f09 390 if (net_xmit_drop_count(ret)) {
25331d6c 391 qdisc_qstats_drop(sch);
378a2f09
JP
392 cbq_mark_toplevel(q, cl);
393 cl->qstats.drops++;
394 }
1da177e4
LT
395 return ret;
396}
397
c3498d34
FW
398/* Overlimit action: penalize leaf class by adding offtime */
399static void cbq_overlimit(struct cbq_class *cl)
1da177e4
LT
400{
401 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
8edc0c31 402 psched_tdiff_t delay = cl->undertime - q->now;
1da177e4
LT
403
404 if (!cl->delayed) {
405 delay += cl->offtime;
406
10297b99 407 /*
cc7ec456
ED
408 * Class goes to sleep, so that it will have no
409 * chance to work avgidle. Let's forgive it 8)
410 *
411 * BTW cbq-2.0 has a crap in this
412 * place, apparently they forgot to shift it by cl->ewma_log.
1da177e4
LT
413 */
414 if (cl->avgidle < 0)
415 delay -= (-cl->avgidle) - ((-cl->avgidle) >> cl->ewma_log);
416 if (cl->avgidle < cl->minidle)
417 cl->avgidle = cl->minidle;
418 if (delay <= 0)
419 delay = 1;
7c59e25f 420 cl->undertime = q->now + delay;
1da177e4
LT
421
422 cl->xstats.overactions++;
423 cl->delayed = 1;
424 }
425 if (q->wd_expires == 0 || q->wd_expires > delay)
426 q->wd_expires = delay;
427
428 /* Dirty work! We must schedule wakeups based on
cc7ec456
ED
429 * real available rate, rather than leaf rate,
430 * which may be tiny (even zero).
1da177e4
LT
431 */
432 if (q->toplevel == TC_CBQ_MAXLEVEL) {
433 struct cbq_class *b;
434 psched_tdiff_t base_delay = q->wd_expires;
435
436 for (b = cl->borrow; b; b = b->borrow) {
8edc0c31 437 delay = b->undertime - q->now;
1da177e4
LT
438 if (delay < base_delay) {
439 if (delay <= 0)
440 delay = 1;
441 base_delay = delay;
442 }
443 }
444
445 q->wd_expires = base_delay;
446 }
447}
448
1a13cb63
PM
449static psched_tdiff_t cbq_undelay_prio(struct cbq_sched_data *q, int prio,
450 psched_time_t now)
1da177e4
LT
451{
452 struct cbq_class *cl;
453 struct cbq_class *cl_prev = q->active[prio];
1a13cb63 454 psched_time_t sched = now;
1da177e4
LT
455
456 if (cl_prev == NULL)
e9054a33 457 return 0;
1da177e4
LT
458
459 do {
460 cl = cl_prev->next_alive;
1a13cb63 461 if (now - cl->penalized > 0) {
1da177e4
LT
462 cl_prev->next_alive = cl->next_alive;
463 cl->next_alive = NULL;
464 cl->cpriority = cl->priority;
465 cl->delayed = 0;
466 cbq_activate_class(cl);
467
468 if (cl == q->active[prio]) {
469 q->active[prio] = cl_prev;
470 if (cl == q->active[prio]) {
471 q->active[prio] = NULL;
472 return 0;
473 }
474 }
475
476 cl = cl_prev->next_alive;
1a13cb63 477 } else if (sched - cl->penalized > 0)
1da177e4
LT
478 sched = cl->penalized;
479 } while ((cl_prev = cl) != q->active[prio]);
480
1a13cb63 481 return sched - now;
1da177e4
LT
482}
483
1a13cb63 484static enum hrtimer_restart cbq_undelay(struct hrtimer *timer)
1da177e4 485{
1a13cb63 486 struct cbq_sched_data *q = container_of(timer, struct cbq_sched_data,
2fbd3da3 487 delay_timer);
1a13cb63
PM
488 struct Qdisc *sch = q->watchdog.qdisc;
489 psched_time_t now;
490 psched_tdiff_t delay = 0;
cc7ec456 491 unsigned int pmask;
1da177e4 492
3bebcda2 493 now = psched_get_time();
1a13cb63 494
1da177e4
LT
495 pmask = q->pmask;
496 q->pmask = 0;
497
498 while (pmask) {
499 int prio = ffz(~pmask);
1a13cb63 500 psched_tdiff_t tmp;
1da177e4
LT
501
502 pmask &= ~(1<<prio);
503
1a13cb63 504 tmp = cbq_undelay_prio(q, prio, now);
1da177e4
LT
505 if (tmp > 0) {
506 q->pmask |= 1<<prio;
507 if (tmp < delay || delay == 0)
508 delay = tmp;
509 }
510 }
511
512 if (delay) {
1a13cb63
PM
513 ktime_t time;
514
8b0e1953 515 time = 0;
ca44d6e6 516 time = ktime_add_ns(time, PSCHED_TICKS2NS(now + delay));
4a8e320c 517 hrtimer_start(&q->delay_timer, time, HRTIMER_MODE_ABS_PINNED);
1da177e4
LT
518 }
519
8608db03 520 __netif_schedule(qdisc_root(sch));
1a13cb63 521 return HRTIMER_NORESTART;
1da177e4
LT
522}
523
10297b99 524/*
cc7ec456
ED
525 * It is mission critical procedure.
526 *
527 * We "regenerate" toplevel cutoff, if transmitting class
528 * has backlog and it is not regulated. It is not part of
529 * original CBQ description, but looks more reasonable.
530 * Probably, it is wrong. This question needs further investigation.
531 */
1da177e4 532
cc7ec456 533static inline void
1da177e4
LT
534cbq_update_toplevel(struct cbq_sched_data *q, struct cbq_class *cl,
535 struct cbq_class *borrowed)
536{
537 if (cl && q->toplevel >= borrowed->level) {
538 if (cl->q->q.qlen > 1) {
539 do {
a084980d 540 if (borrowed->undertime == PSCHED_PASTPERFECT) {
1da177e4
LT
541 q->toplevel = borrowed->level;
542 return;
543 }
cc7ec456 544 } while ((borrowed = borrowed->borrow) != NULL);
1da177e4 545 }
10297b99 546#if 0
1da177e4
LT
547 /* It is not necessary now. Uncommenting it
548 will save CPU cycles, but decrease fairness.
549 */
550 q->toplevel = TC_CBQ_MAXLEVEL;
551#endif
552 }
553}
554
555static void
556cbq_update(struct cbq_sched_data *q)
557{
558 struct cbq_class *this = q->tx_class;
559 struct cbq_class *cl = this;
560 int len = q->tx_len;
73d0f37a 561 psched_time_t now;
1da177e4
LT
562
563 q->tx_class = NULL;
73d0f37a
VA
564 /* Time integrator. We calculate EOS time
565 * by adding expected packet transmission time.
566 */
567 now = q->now + L2T(&q->link, len);
1da177e4
LT
568
569 for ( ; cl; cl = cl->share) {
570 long avgidle = cl->avgidle;
571 long idle;
572
573 cl->bstats.packets++;
574 cl->bstats.bytes += len;
575
576 /*
cc7ec456
ED
577 * (now - last) is total time between packet right edges.
578 * (last_pktlen/rate) is "virtual" busy time, so that
579 *
580 * idle = (now - last) - last_pktlen/rate
1da177e4
LT
581 */
582
73d0f37a 583 idle = now - cl->last;
1da177e4
LT
584 if ((unsigned long)idle > 128*1024*1024) {
585 avgidle = cl->maxidle;
586 } else {
587 idle -= L2T(cl, len);
588
589 /* true_avgidle := (1-W)*true_avgidle + W*idle,
cc7ec456
ED
590 * where W=2^{-ewma_log}. But cl->avgidle is scaled:
591 * cl->avgidle == true_avgidle/W,
592 * hence:
1da177e4
LT
593 */
594 avgidle += idle - (avgidle>>cl->ewma_log);
595 }
596
597 if (avgidle <= 0) {
598 /* Overlimit or at-limit */
599
600 if (avgidle < cl->minidle)
601 avgidle = cl->minidle;
602
603 cl->avgidle = avgidle;
604
605 /* Calculate expected time, when this class
cc7ec456
ED
606 * will be allowed to send.
607 * It will occur, when:
608 * (1-W)*true_avgidle + W*delay = 0, i.e.
609 * idle = (1/W - 1)*(-true_avgidle)
610 * or
611 * idle = (1 - W)*(-cl->avgidle);
1da177e4
LT
612 */
613 idle = (-avgidle) - ((-avgidle) >> cl->ewma_log);
614
615 /*
cc7ec456
ED
616 * That is not all.
617 * To maintain the rate allocated to the class,
618 * we add to undertime virtual clock,
619 * necessary to complete transmitted packet.
620 * (len/phys_bandwidth has been already passed
621 * to the moment of cbq_update)
1da177e4
LT
622 */
623
624 idle -= L2T(&q->link, len);
625 idle += L2T(cl, len);
626
73d0f37a 627 cl->undertime = now + idle;
1da177e4
LT
628 } else {
629 /* Underlimit */
630
a084980d 631 cl->undertime = PSCHED_PASTPERFECT;
1da177e4
LT
632 if (avgidle > cl->maxidle)
633 cl->avgidle = cl->maxidle;
634 else
635 cl->avgidle = avgidle;
636 }
73d0f37a
VA
637 if ((s64)(now - cl->last) > 0)
638 cl->last = now;
1da177e4
LT
639 }
640
641 cbq_update_toplevel(q, this, q->tx_borrowed);
642}
643
cc7ec456 644static inline struct cbq_class *
1da177e4
LT
645cbq_under_limit(struct cbq_class *cl)
646{
647 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
648 struct cbq_class *this_cl = cl;
649
650 if (cl->tparent == NULL)
651 return cl;
652
a084980d 653 if (cl->undertime == PSCHED_PASTPERFECT || q->now >= cl->undertime) {
1da177e4
LT
654 cl->delayed = 0;
655 return cl;
656 }
657
658 do {
659 /* It is very suspicious place. Now overlimit
cc7ec456
ED
660 * action is generated for not bounded classes
661 * only if link is completely congested.
662 * Though it is in agree with ancestor-only paradigm,
663 * it looks very stupid. Particularly,
664 * it means that this chunk of code will either
665 * never be called or result in strong amplification
666 * of burstiness. Dangerous, silly, and, however,
667 * no another solution exists.
1da177e4 668 */
cc7ec456
ED
669 cl = cl->borrow;
670 if (!cl) {
1da177e4 671 this_cl->qstats.overlimits++;
c3498d34 672 cbq_overlimit(this_cl);
1da177e4
LT
673 return NULL;
674 }
675 if (cl->level > q->toplevel)
676 return NULL;
a084980d 677 } while (cl->undertime != PSCHED_PASTPERFECT && q->now < cl->undertime);
1da177e4
LT
678
679 cl->delayed = 0;
680 return cl;
681}
682
cc7ec456 683static inline struct sk_buff *
1da177e4
LT
684cbq_dequeue_prio(struct Qdisc *sch, int prio)
685{
686 struct cbq_sched_data *q = qdisc_priv(sch);
687 struct cbq_class *cl_tail, *cl_prev, *cl;
688 struct sk_buff *skb;
689 int deficit;
690
691 cl_tail = cl_prev = q->active[prio];
692 cl = cl_prev->next_alive;
693
694 do {
695 deficit = 0;
696
697 /* Start round */
698 do {
699 struct cbq_class *borrow = cl;
700
701 if (cl->q->q.qlen &&
702 (borrow = cbq_under_limit(cl)) == NULL)
703 goto skip_class;
704
705 if (cl->deficit <= 0) {
706 /* Class exhausted its allotment per
cc7ec456 707 * this round. Switch to the next one.
1da177e4
LT
708 */
709 deficit = 1;
710 cl->deficit += cl->quantum;
711 goto next_class;
712 }
713
714 skb = cl->q->dequeue(cl->q);
715
716 /* Class did not give us any skb :-(
cc7ec456
ED
717 * It could occur even if cl->q->q.qlen != 0
718 * f.e. if cl->q == "tbf"
1da177e4
LT
719 */
720 if (skb == NULL)
721 goto skip_class;
722
0abf77e5 723 cl->deficit -= qdisc_pkt_len(skb);
1da177e4
LT
724 q->tx_class = cl;
725 q->tx_borrowed = borrow;
726 if (borrow != cl) {
727#ifndef CBQ_XSTATS_BORROWS_BYTES
728 borrow->xstats.borrows++;
729 cl->xstats.borrows++;
730#else
0abf77e5
JK
731 borrow->xstats.borrows += qdisc_pkt_len(skb);
732 cl->xstats.borrows += qdisc_pkt_len(skb);
1da177e4
LT
733#endif
734 }
0abf77e5 735 q->tx_len = qdisc_pkt_len(skb);
1da177e4
LT
736
737 if (cl->deficit <= 0) {
738 q->active[prio] = cl;
739 cl = cl->next_alive;
740 cl->deficit += cl->quantum;
741 }
742 return skb;
743
744skip_class:
745 if (cl->q->q.qlen == 0 || prio != cl->cpriority) {
746 /* Class is empty or penalized.
cc7ec456 747 * Unlink it from active chain.
1da177e4
LT
748 */
749 cl_prev->next_alive = cl->next_alive;
750 cl->next_alive = NULL;
751
752 /* Did cl_tail point to it? */
753 if (cl == cl_tail) {
754 /* Repair it! */
755 cl_tail = cl_prev;
756
757 /* Was it the last class in this band? */
758 if (cl == cl_tail) {
759 /* Kill the band! */
760 q->active[prio] = NULL;
761 q->activemask &= ~(1<<prio);
762 if (cl->q->q.qlen)
763 cbq_activate_class(cl);
764 return NULL;
765 }
766
767 q->active[prio] = cl_tail;
768 }
769 if (cl->q->q.qlen)
770 cbq_activate_class(cl);
771
772 cl = cl_prev;
773 }
774
775next_class:
776 cl_prev = cl;
777 cl = cl->next_alive;
778 } while (cl_prev != cl_tail);
779 } while (deficit);
780
781 q->active[prio] = cl_prev;
782
783 return NULL;
784}
785
cc7ec456 786static inline struct sk_buff *
1da177e4
LT
787cbq_dequeue_1(struct Qdisc *sch)
788{
789 struct cbq_sched_data *q = qdisc_priv(sch);
790 struct sk_buff *skb;
cc7ec456 791 unsigned int activemask;
1da177e4 792
cc7ec456 793 activemask = q->activemask & 0xFF;
1da177e4
LT
794 while (activemask) {
795 int prio = ffz(~activemask);
796 activemask &= ~(1<<prio);
797 skb = cbq_dequeue_prio(sch, prio);
798 if (skb)
799 return skb;
800 }
801 return NULL;
802}
803
804static struct sk_buff *
805cbq_dequeue(struct Qdisc *sch)
806{
807 struct sk_buff *skb;
808 struct cbq_sched_data *q = qdisc_priv(sch);
809 psched_time_t now;
1da177e4 810
3bebcda2 811 now = psched_get_time();
73d0f37a
VA
812
813 if (q->tx_class)
1da177e4 814 cbq_update(q);
73d0f37a
VA
815
816 q->now = now;
1da177e4
LT
817
818 for (;;) {
819 q->wd_expires = 0;
820
821 skb = cbq_dequeue_1(sch);
822 if (skb) {
9190b3b3 823 qdisc_bstats_update(sch, skb);
1da177e4 824 sch->q.qlen--;
1da177e4
LT
825 return skb;
826 }
827
828 /* All the classes are overlimit.
cc7ec456
ED
829 *
830 * It is possible, if:
831 *
832 * 1. Scheduler is empty.
833 * 2. Toplevel cutoff inhibited borrowing.
834 * 3. Root class is overlimit.
835 *
836 * Reset 2d and 3d conditions and retry.
837 *
838 * Note, that NS and cbq-2.0 are buggy, peeking
839 * an arbitrary class is appropriate for ancestor-only
840 * sharing, but not for toplevel algorithm.
841 *
842 * Our version is better, but slower, because it requires
843 * two passes, but it is unavoidable with top-level sharing.
844 */
1da177e4
LT
845
846 if (q->toplevel == TC_CBQ_MAXLEVEL &&
a084980d 847 q->link.undertime == PSCHED_PASTPERFECT)
1da177e4
LT
848 break;
849
850 q->toplevel = TC_CBQ_MAXLEVEL;
a084980d 851 q->link.undertime = PSCHED_PASTPERFECT;
1da177e4
LT
852 }
853
854 /* No packets in scheduler or nobody wants to give them to us :-(
cc7ec456
ED
855 * Sigh... start watchdog timer in the last case.
856 */
1da177e4
LT
857
858 if (sch->q.qlen) {
25331d6c 859 qdisc_qstats_overlimit(sch);
88a99354
PM
860 if (q->wd_expires)
861 qdisc_watchdog_schedule(&q->watchdog,
bb239acf 862 now + q->wd_expires);
1da177e4
LT
863 }
864 return NULL;
865}
866
867/* CBQ class maintanance routines */
868
869static void cbq_adjust_levels(struct cbq_class *this)
870{
871 if (this == NULL)
872 return;
873
874 do {
875 int level = 0;
876 struct cbq_class *cl;
877
cc7ec456
ED
878 cl = this->children;
879 if (cl) {
1da177e4
LT
880 do {
881 if (cl->level > level)
882 level = cl->level;
883 } while ((cl = cl->sibling) != this->children);
884 }
cc7ec456 885 this->level = level + 1;
1da177e4
LT
886 } while ((this = this->tparent) != NULL);
887}
888
889static void cbq_normalize_quanta(struct cbq_sched_data *q, int prio)
890{
891 struct cbq_class *cl;
d77fea2e 892 unsigned int h;
1da177e4
LT
893
894 if (q->quanta[prio] == 0)
895 return;
896
d77fea2e 897 for (h = 0; h < q->clhash.hashsize; h++) {
b67bfe0d 898 hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
1da177e4 899 /* BUGGGG... Beware! This expression suffer of
cc7ec456 900 * arithmetic overflows!
1da177e4
LT
901 */
902 if (cl->priority == prio) {
903 cl->quantum = (cl->weight*cl->allot*q->nclasses[prio])/
904 q->quanta[prio];
905 }
833fa743
YY
906 if (cl->quantum <= 0 ||
907 cl->quantum > 32*qdisc_dev(cl->qdisc)->mtu) {
c17988a9
YY
908 pr_warn("CBQ: class %08x has bad quantum==%ld, repaired.\n",
909 cl->common.classid, cl->quantum);
5ce2d488 910 cl->quantum = qdisc_dev(cl->qdisc)->mtu/2 + 1;
1da177e4
LT
911 }
912 }
913 }
914}
915
916static void cbq_sync_defmap(struct cbq_class *cl)
917{
918 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
919 struct cbq_class *split = cl->split;
cc7ec456 920 unsigned int h;
1da177e4
LT
921 int i;
922
923 if (split == NULL)
924 return;
925
cc7ec456
ED
926 for (i = 0; i <= TC_PRIO_MAX; i++) {
927 if (split->defaults[i] == cl && !(cl->defmap & (1<<i)))
1da177e4
LT
928 split->defaults[i] = NULL;
929 }
930
cc7ec456 931 for (i = 0; i <= TC_PRIO_MAX; i++) {
1da177e4
LT
932 int level = split->level;
933
934 if (split->defaults[i])
935 continue;
936
d77fea2e 937 for (h = 0; h < q->clhash.hashsize; h++) {
1da177e4
LT
938 struct cbq_class *c;
939
b67bfe0d 940 hlist_for_each_entry(c, &q->clhash.hash[h],
d77fea2e 941 common.hnode) {
1da177e4 942 if (c->split == split && c->level < level &&
cc7ec456 943 c->defmap & (1<<i)) {
1da177e4
LT
944 split->defaults[i] = c;
945 level = c->level;
946 }
947 }
948 }
949 }
950}
951
952static void cbq_change_defmap(struct cbq_class *cl, u32 splitid, u32 def, u32 mask)
953{
954 struct cbq_class *split = NULL;
955
956 if (splitid == 0) {
cc7ec456
ED
957 split = cl->split;
958 if (!split)
1da177e4 959 return;
d77fea2e 960 splitid = split->common.classid;
1da177e4
LT
961 }
962
d77fea2e 963 if (split == NULL || split->common.classid != splitid) {
1da177e4 964 for (split = cl->tparent; split; split = split->tparent)
d77fea2e 965 if (split->common.classid == splitid)
1da177e4
LT
966 break;
967 }
968
969 if (split == NULL)
970 return;
971
972 if (cl->split != split) {
973 cl->defmap = 0;
974 cbq_sync_defmap(cl);
975 cl->split = split;
cc7ec456 976 cl->defmap = def & mask;
1da177e4 977 } else
cc7ec456 978 cl->defmap = (cl->defmap & ~mask) | (def & mask);
1da177e4
LT
979
980 cbq_sync_defmap(cl);
981}
982
983static void cbq_unlink_class(struct cbq_class *this)
984{
985 struct cbq_class *cl, **clp;
986 struct cbq_sched_data *q = qdisc_priv(this->qdisc);
987
d77fea2e 988 qdisc_class_hash_remove(&q->clhash, &this->common);
1da177e4
LT
989
990 if (this->tparent) {
cc7ec456 991 clp = &this->sibling;
1da177e4
LT
992 cl = *clp;
993 do {
994 if (cl == this) {
995 *clp = cl->sibling;
996 break;
997 }
998 clp = &cl->sibling;
999 } while ((cl = *clp) != this->sibling);
1000
1001 if (this->tparent->children == this) {
1002 this->tparent->children = this->sibling;
1003 if (this->sibling == this)
1004 this->tparent->children = NULL;
1005 }
1006 } else {
547b792c 1007 WARN_ON(this->sibling != this);
1da177e4
LT
1008 }
1009}
1010
1011static void cbq_link_class(struct cbq_class *this)
1012{
1013 struct cbq_sched_data *q = qdisc_priv(this->qdisc);
1da177e4
LT
1014 struct cbq_class *parent = this->tparent;
1015
1016 this->sibling = this;
d77fea2e 1017 qdisc_class_hash_insert(&q->clhash, &this->common);
1da177e4
LT
1018
1019 if (parent == NULL)
1020 return;
1021
1022 if (parent->children == NULL) {
1023 parent->children = this;
1024 } else {
1025 this->sibling = parent->children->sibling;
1026 parent->children->sibling = this;
1027 }
1028}
1029
1da177e4 1030static void
cc7ec456 1031cbq_reset(struct Qdisc *sch)
1da177e4
LT
1032{
1033 struct cbq_sched_data *q = qdisc_priv(sch);
1034 struct cbq_class *cl;
1035 int prio;
cc7ec456 1036 unsigned int h;
1da177e4
LT
1037
1038 q->activemask = 0;
1039 q->pmask = 0;
1040 q->tx_class = NULL;
1041 q->tx_borrowed = NULL;
88a99354 1042 qdisc_watchdog_cancel(&q->watchdog);
2fbd3da3 1043 hrtimer_cancel(&q->delay_timer);
1da177e4 1044 q->toplevel = TC_CBQ_MAXLEVEL;
3bebcda2 1045 q->now = psched_get_time();
1da177e4
LT
1046
1047 for (prio = 0; prio <= TC_CBQ_MAXPRIO; prio++)
1048 q->active[prio] = NULL;
1049
d77fea2e 1050 for (h = 0; h < q->clhash.hashsize; h++) {
b67bfe0d 1051 hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
1da177e4
LT
1052 qdisc_reset(cl->q);
1053
1054 cl->next_alive = NULL;
a084980d 1055 cl->undertime = PSCHED_PASTPERFECT;
1da177e4
LT
1056 cl->avgidle = cl->maxidle;
1057 cl->deficit = cl->quantum;
1058 cl->cpriority = cl->priority;
1059 }
1060 }
1061 sch->q.qlen = 0;
1062}
1063
1064
1065static int cbq_set_lss(struct cbq_class *cl, struct tc_cbq_lssopt *lss)
1066{
cc7ec456
ED
1067 if (lss->change & TCF_CBQ_LSS_FLAGS) {
1068 cl->share = (lss->flags & TCF_CBQ_LSS_ISOLATED) ? NULL : cl->tparent;
1069 cl->borrow = (lss->flags & TCF_CBQ_LSS_BOUNDED) ? NULL : cl->tparent;
1da177e4 1070 }
cc7ec456 1071 if (lss->change & TCF_CBQ_LSS_EWMA)
1da177e4 1072 cl->ewma_log = lss->ewma_log;
cc7ec456 1073 if (lss->change & TCF_CBQ_LSS_AVPKT)
1da177e4 1074 cl->avpkt = lss->avpkt;
cc7ec456 1075 if (lss->change & TCF_CBQ_LSS_MINIDLE)
1da177e4 1076 cl->minidle = -(long)lss->minidle;
cc7ec456 1077 if (lss->change & TCF_CBQ_LSS_MAXIDLE) {
1da177e4
LT
1078 cl->maxidle = lss->maxidle;
1079 cl->avgidle = lss->maxidle;
1080 }
cc7ec456 1081 if (lss->change & TCF_CBQ_LSS_OFFTIME)
1da177e4
LT
1082 cl->offtime = lss->offtime;
1083 return 0;
1084}
1085
1086static void cbq_rmprio(struct cbq_sched_data *q, struct cbq_class *cl)
1087{
1088 q->nclasses[cl->priority]--;
1089 q->quanta[cl->priority] -= cl->weight;
1090 cbq_normalize_quanta(q, cl->priority);
1091}
1092
1093static void cbq_addprio(struct cbq_sched_data *q, struct cbq_class *cl)
1094{
1095 q->nclasses[cl->priority]++;
1096 q->quanta[cl->priority] += cl->weight;
1097 cbq_normalize_quanta(q, cl->priority);
1098}
1099
1100static int cbq_set_wrr(struct cbq_class *cl, struct tc_cbq_wrropt *wrr)
1101{
1102 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
1103
1104 if (wrr->allot)
1105 cl->allot = wrr->allot;
1106 if (wrr->weight)
1107 cl->weight = wrr->weight;
1108 if (wrr->priority) {
cc7ec456 1109 cl->priority = wrr->priority - 1;
1da177e4
LT
1110 cl->cpriority = cl->priority;
1111 if (cl->priority >= cl->priority2)
cc7ec456 1112 cl->priority2 = TC_CBQ_MAXPRIO - 1;
1da177e4
LT
1113 }
1114
1115 cbq_addprio(q, cl);
1116 return 0;
1117}
1118
1da177e4
LT
1119static int cbq_set_fopt(struct cbq_class *cl, struct tc_cbq_fopt *fopt)
1120{
1121 cbq_change_defmap(cl, fopt->split, fopt->defmap, fopt->defchange);
1122 return 0;
1123}
1124
27a3421e
PM
1125static const struct nla_policy cbq_policy[TCA_CBQ_MAX + 1] = {
1126 [TCA_CBQ_LSSOPT] = { .len = sizeof(struct tc_cbq_lssopt) },
1127 [TCA_CBQ_WRROPT] = { .len = sizeof(struct tc_cbq_wrropt) },
1128 [TCA_CBQ_FOPT] = { .len = sizeof(struct tc_cbq_fopt) },
1129 [TCA_CBQ_OVL_STRATEGY] = { .len = sizeof(struct tc_cbq_ovl) },
1130 [TCA_CBQ_RATE] = { .len = sizeof(struct tc_ratespec) },
1131 [TCA_CBQ_RTAB] = { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
1132 [TCA_CBQ_POLICE] = { .len = sizeof(struct tc_cbq_police) },
1133};
1134
1e90474c 1135static int cbq_init(struct Qdisc *sch, struct nlattr *opt)
1da177e4
LT
1136{
1137 struct cbq_sched_data *q = qdisc_priv(sch);
1e90474c 1138 struct nlattr *tb[TCA_CBQ_MAX + 1];
1da177e4 1139 struct tc_ratespec *r;
cee63723
PM
1140 int err;
1141
fceb6435 1142 err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, NULL);
cee63723
PM
1143 if (err < 0)
1144 return err;
1da177e4 1145
27a3421e 1146 if (tb[TCA_CBQ_RTAB] == NULL || tb[TCA_CBQ_RATE] == NULL)
1da177e4
LT
1147 return -EINVAL;
1148
1e90474c 1149 r = nla_data(tb[TCA_CBQ_RATE]);
1da177e4 1150
1e90474c 1151 if ((q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB])) == NULL)
1da177e4
LT
1152 return -EINVAL;
1153
d77fea2e
PM
1154 err = qdisc_class_hash_init(&q->clhash);
1155 if (err < 0)
1156 goto put_rtab;
1157
1da177e4
LT
1158 q->link.refcnt = 1;
1159 q->link.sibling = &q->link;
d77fea2e 1160 q->link.common.classid = sch->handle;
1da177e4 1161 q->link.qdisc = sch;
3511c913
CG
1162 q->link.q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
1163 sch->handle);
1164 if (!q->link.q)
1da177e4 1165 q->link.q = &noop_qdisc;
49b49971
JK
1166 else
1167 qdisc_hash_add(q->link.q, true);
1da177e4 1168
cc7ec456
ED
1169 q->link.priority = TC_CBQ_MAXPRIO - 1;
1170 q->link.priority2 = TC_CBQ_MAXPRIO - 1;
1171 q->link.cpriority = TC_CBQ_MAXPRIO - 1;
5ce2d488 1172 q->link.allot = psched_mtu(qdisc_dev(sch));
1da177e4
LT
1173 q->link.quantum = q->link.allot;
1174 q->link.weight = q->link.R_tab->rate.rate;
1175
1176 q->link.ewma_log = TC_CBQ_DEF_EWMA;
1177 q->link.avpkt = q->link.allot/2;
1178 q->link.minidle = -0x7FFFFFFF;
1da177e4 1179
88a99354 1180 qdisc_watchdog_init(&q->watchdog, sch);
4a8e320c 1181 hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED);
1da177e4
LT
1182 q->delay_timer.function = cbq_undelay;
1183 q->toplevel = TC_CBQ_MAXLEVEL;
3bebcda2 1184 q->now = psched_get_time();
1da177e4
LT
1185
1186 cbq_link_class(&q->link);
1187
1e90474c
PM
1188 if (tb[TCA_CBQ_LSSOPT])
1189 cbq_set_lss(&q->link, nla_data(tb[TCA_CBQ_LSSOPT]));
1da177e4
LT
1190
1191 cbq_addprio(q, &q->link);
1192 return 0;
d77fea2e
PM
1193
1194put_rtab:
1195 qdisc_put_rtab(q->link.R_tab);
1196 return err;
1da177e4
LT
1197}
1198
cc7ec456 1199static int cbq_dump_rate(struct sk_buff *skb, struct cbq_class *cl)
1da177e4 1200{
27a884dc 1201 unsigned char *b = skb_tail_pointer(skb);
1da177e4 1202
1b34ec43
DM
1203 if (nla_put(skb, TCA_CBQ_RATE, sizeof(cl->R_tab->rate), &cl->R_tab->rate))
1204 goto nla_put_failure;
1da177e4
LT
1205 return skb->len;
1206
1e90474c 1207nla_put_failure:
dc5fc579 1208 nlmsg_trim(skb, b);
1da177e4
LT
1209 return -1;
1210}
1211
cc7ec456 1212static int cbq_dump_lss(struct sk_buff *skb, struct cbq_class *cl)
1da177e4 1213{
27a884dc 1214 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
1215 struct tc_cbq_lssopt opt;
1216
1217 opt.flags = 0;
1218 if (cl->borrow == NULL)
1219 opt.flags |= TCF_CBQ_LSS_BOUNDED;
1220 if (cl->share == NULL)
1221 opt.flags |= TCF_CBQ_LSS_ISOLATED;
1222 opt.ewma_log = cl->ewma_log;
1223 opt.level = cl->level;
1224 opt.avpkt = cl->avpkt;
1225 opt.maxidle = cl->maxidle;
1226 opt.minidle = (u32)(-cl->minidle);
1227 opt.offtime = cl->offtime;
1228 opt.change = ~0;
1b34ec43
DM
1229 if (nla_put(skb, TCA_CBQ_LSSOPT, sizeof(opt), &opt))
1230 goto nla_put_failure;
1da177e4
LT
1231 return skb->len;
1232
1e90474c 1233nla_put_failure:
dc5fc579 1234 nlmsg_trim(skb, b);
1da177e4
LT
1235 return -1;
1236}
1237
cc7ec456 1238static int cbq_dump_wrr(struct sk_buff *skb, struct cbq_class *cl)
1da177e4 1239{
27a884dc 1240 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
1241 struct tc_cbq_wrropt opt;
1242
a0db856a 1243 memset(&opt, 0, sizeof(opt));
1da177e4
LT
1244 opt.flags = 0;
1245 opt.allot = cl->allot;
cc7ec456
ED
1246 opt.priority = cl->priority + 1;
1247 opt.cpriority = cl->cpriority + 1;
1da177e4 1248 opt.weight = cl->weight;
1b34ec43
DM
1249 if (nla_put(skb, TCA_CBQ_WRROPT, sizeof(opt), &opt))
1250 goto nla_put_failure;
1da177e4
LT
1251 return skb->len;
1252
1e90474c 1253nla_put_failure:
dc5fc579 1254 nlmsg_trim(skb, b);
1da177e4
LT
1255 return -1;
1256}
1257
cc7ec456 1258static int cbq_dump_fopt(struct sk_buff *skb, struct cbq_class *cl)
1da177e4 1259{
27a884dc 1260 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
1261 struct tc_cbq_fopt opt;
1262
1263 if (cl->split || cl->defmap) {
d77fea2e 1264 opt.split = cl->split ? cl->split->common.classid : 0;
1da177e4
LT
1265 opt.defmap = cl->defmap;
1266 opt.defchange = ~0;
1b34ec43
DM
1267 if (nla_put(skb, TCA_CBQ_FOPT, sizeof(opt), &opt))
1268 goto nla_put_failure;
1da177e4
LT
1269 }
1270 return skb->len;
1271
1e90474c 1272nla_put_failure:
dc5fc579 1273 nlmsg_trim(skb, b);
1da177e4
LT
1274 return -1;
1275}
1276
1da177e4
LT
1277static int cbq_dump_attr(struct sk_buff *skb, struct cbq_class *cl)
1278{
1279 if (cbq_dump_lss(skb, cl) < 0 ||
1280 cbq_dump_rate(skb, cl) < 0 ||
1281 cbq_dump_wrr(skb, cl) < 0 ||
1da177e4
LT
1282 cbq_dump_fopt(skb, cl) < 0)
1283 return -1;
1284 return 0;
1285}
1286
1287static int cbq_dump(struct Qdisc *sch, struct sk_buff *skb)
1288{
1289 struct cbq_sched_data *q = qdisc_priv(sch);
4b3550ef 1290 struct nlattr *nest;
1da177e4 1291
4b3550ef
PM
1292 nest = nla_nest_start(skb, TCA_OPTIONS);
1293 if (nest == NULL)
1294 goto nla_put_failure;
1da177e4 1295 if (cbq_dump_attr(skb, &q->link) < 0)
1e90474c 1296 goto nla_put_failure;
d59b7d80 1297 return nla_nest_end(skb, nest);
1da177e4 1298
1e90474c 1299nla_put_failure:
4b3550ef 1300 nla_nest_cancel(skb, nest);
1da177e4
LT
1301 return -1;
1302}
1303
1304static int
1305cbq_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
1306{
1307 struct cbq_sched_data *q = qdisc_priv(sch);
1308
1309 q->link.xstats.avgidle = q->link.avgidle;
1310 return gnet_stats_copy_app(d, &q->link.xstats, sizeof(q->link.xstats));
1311}
1312
1313static int
1314cbq_dump_class(struct Qdisc *sch, unsigned long arg,
1315 struct sk_buff *skb, struct tcmsg *tcm)
1316{
cc7ec456 1317 struct cbq_class *cl = (struct cbq_class *)arg;
4b3550ef 1318 struct nlattr *nest;
1da177e4
LT
1319
1320 if (cl->tparent)
d77fea2e 1321 tcm->tcm_parent = cl->tparent->common.classid;
1da177e4
LT
1322 else
1323 tcm->tcm_parent = TC_H_ROOT;
d77fea2e 1324 tcm->tcm_handle = cl->common.classid;
1da177e4
LT
1325 tcm->tcm_info = cl->q->handle;
1326
4b3550ef
PM
1327 nest = nla_nest_start(skb, TCA_OPTIONS);
1328 if (nest == NULL)
1329 goto nla_put_failure;
1da177e4 1330 if (cbq_dump_attr(skb, cl) < 0)
1e90474c 1331 goto nla_put_failure;
d59b7d80 1332 return nla_nest_end(skb, nest);
1da177e4 1333
1e90474c 1334nla_put_failure:
4b3550ef 1335 nla_nest_cancel(skb, nest);
1da177e4
LT
1336 return -1;
1337}
1338
1339static int
1340cbq_dump_class_stats(struct Qdisc *sch, unsigned long arg,
1341 struct gnet_dump *d)
1342{
1343 struct cbq_sched_data *q = qdisc_priv(sch);
cc7ec456 1344 struct cbq_class *cl = (struct cbq_class *)arg;
1da177e4 1345
1da177e4
LT
1346 cl->xstats.avgidle = cl->avgidle;
1347 cl->xstats.undertime = 0;
1348
a084980d 1349 if (cl->undertime != PSCHED_PASTPERFECT)
8edc0c31 1350 cl->xstats.undertime = cl->undertime - q->now;
1da177e4 1351
edb09eb1
ED
1352 if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch),
1353 d, NULL, &cl->bstats) < 0 ||
1c0d32fd 1354 gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 ||
b0ab6f92 1355 gnet_stats_copy_queue(d, NULL, &cl->qstats, cl->q->q.qlen) < 0)
1da177e4
LT
1356 return -1;
1357
1358 return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats));
1359}
1360
1361static int cbq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
1362 struct Qdisc **old)
1363{
cc7ec456 1364 struct cbq_class *cl = (struct cbq_class *)arg;
1da177e4 1365
5b9a9ccf 1366 if (new == NULL) {
3511c913 1367 new = qdisc_create_dflt(sch->dev_queue,
5b9a9ccf
PM
1368 &pfifo_qdisc_ops, cl->common.classid);
1369 if (new == NULL)
1370 return -ENOBUFS;
1da177e4 1371 }
5b9a9ccf 1372
86a7996c 1373 *old = qdisc_replace(sch, new, &cl->q);
5b9a9ccf 1374 return 0;
1da177e4
LT
1375}
1376
cc7ec456 1377static struct Qdisc *cbq_leaf(struct Qdisc *sch, unsigned long arg)
1da177e4 1378{
cc7ec456 1379 struct cbq_class *cl = (struct cbq_class *)arg;
1da177e4 1380
5b9a9ccf 1381 return cl->q;
1da177e4
LT
1382}
1383
a37ef2e3
JP
1384static void cbq_qlen_notify(struct Qdisc *sch, unsigned long arg)
1385{
1386 struct cbq_class *cl = (struct cbq_class *)arg;
1387
95946658 1388 cbq_deactivate_class(cl);
a37ef2e3
JP
1389}
1390
1da177e4
LT
1391static unsigned long cbq_get(struct Qdisc *sch, u32 classid)
1392{
1393 struct cbq_sched_data *q = qdisc_priv(sch);
1394 struct cbq_class *cl = cbq_class_lookup(q, classid);
1395
1396 if (cl) {
1397 cl->refcnt++;
1398 return (unsigned long)cl;
1399 }
1400 return 0;
1401}
1402
1da177e4
LT
1403static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl)
1404{
1405 struct cbq_sched_data *q = qdisc_priv(sch);
1406
547b792c 1407 WARN_ON(cl->filters);
1da177e4 1408
6529eaba 1409 tcf_block_put(cl->block);
1da177e4
LT
1410 qdisc_destroy(cl->q);
1411 qdisc_put_rtab(cl->R_tab);
1c0d32fd 1412 gen_kill_estimator(&cl->rate_est);
1da177e4
LT
1413 if (cl != &q->link)
1414 kfree(cl);
1415}
1416
cc7ec456 1417static void cbq_destroy(struct Qdisc *sch)
1da177e4
LT
1418{
1419 struct cbq_sched_data *q = qdisc_priv(sch);
b67bfe0d 1420 struct hlist_node *next;
1da177e4 1421 struct cbq_class *cl;
cc7ec456 1422 unsigned int h;
1da177e4 1423
c3bc7cff 1424#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1425 q->rx_class = NULL;
1426#endif
1427 /*
1428 * Filters must be destroyed first because we don't destroy the
1429 * classes from root to leafs which means that filters can still
1430 * be bound to classes which have been destroyed already. --TGR '04
1431 */
d77fea2e 1432 for (h = 0; h < q->clhash.hashsize; h++) {
89890422 1433 hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
6529eaba 1434 tcf_block_put(cl->block);
89890422
KK
1435 cl->block = NULL;
1436 }
b00b4bf9 1437 }
d77fea2e 1438 for (h = 0; h < q->clhash.hashsize; h++) {
b67bfe0d 1439 hlist_for_each_entry_safe(cl, next, &q->clhash.hash[h],
d77fea2e 1440 common.hnode)
1da177e4 1441 cbq_destroy_class(sch, cl);
1da177e4 1442 }
d77fea2e 1443 qdisc_class_hash_destroy(&q->clhash);
1da177e4
LT
1444}
1445
1446static void cbq_put(struct Qdisc *sch, unsigned long arg)
1447{
cc7ec456 1448 struct cbq_class *cl = (struct cbq_class *)arg;
1da177e4
LT
1449
1450 if (--cl->refcnt == 0) {
c3bc7cff 1451#ifdef CONFIG_NET_CLS_ACT
102396ae 1452 spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
1da177e4
LT
1453 struct cbq_sched_data *q = qdisc_priv(sch);
1454
7698b4fc 1455 spin_lock_bh(root_lock);
1da177e4
LT
1456 if (q->rx_class == cl)
1457 q->rx_class = NULL;
7698b4fc 1458 spin_unlock_bh(root_lock);
1da177e4
LT
1459#endif
1460
1461 cbq_destroy_class(sch, cl);
1462 }
1463}
1464
1465static int
1e90474c 1466cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **tca,
1da177e4
LT
1467 unsigned long *arg)
1468{
1469 int err;
1470 struct cbq_sched_data *q = qdisc_priv(sch);
cc7ec456 1471 struct cbq_class *cl = (struct cbq_class *)*arg;
1e90474c
PM
1472 struct nlattr *opt = tca[TCA_OPTIONS];
1473 struct nlattr *tb[TCA_CBQ_MAX + 1];
1da177e4
LT
1474 struct cbq_class *parent;
1475 struct qdisc_rate_table *rtab = NULL;
1476
cee63723 1477 if (opt == NULL)
1da177e4
LT
1478 return -EINVAL;
1479
fceb6435 1480 err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy, NULL);
cee63723
PM
1481 if (err < 0)
1482 return err;
1483
dd47c1fa 1484 if (tb[TCA_CBQ_OVL_STRATEGY] || tb[TCA_CBQ_POLICE])
c3498d34
FW
1485 return -EOPNOTSUPP;
1486
1da177e4
LT
1487 if (cl) {
1488 /* Check parent */
1489 if (parentid) {
d77fea2e
PM
1490 if (cl->tparent &&
1491 cl->tparent->common.classid != parentid)
1da177e4
LT
1492 return -EINVAL;
1493 if (!cl->tparent && parentid != TC_H_ROOT)
1494 return -EINVAL;
1495 }
1496
1e90474c 1497 if (tb[TCA_CBQ_RATE]) {
71bcb09a
SH
1498 rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]),
1499 tb[TCA_CBQ_RTAB]);
1da177e4
LT
1500 if (rtab == NULL)
1501 return -EINVAL;
1502 }
1503
71bcb09a 1504 if (tca[TCA_RATE]) {
22e0f8b9
JF
1505 err = gen_replace_estimator(&cl->bstats, NULL,
1506 &cl->rate_est,
edb09eb1
ED
1507 NULL,
1508 qdisc_root_sleeping_running(sch),
71bcb09a
SH
1509 tca[TCA_RATE]);
1510 if (err) {
79c11f2e 1511 qdisc_put_rtab(rtab);
71bcb09a
SH
1512 return err;
1513 }
1514 }
1515
1da177e4
LT
1516 /* Change class parameters */
1517 sch_tree_lock(sch);
1518
1519 if (cl->next_alive != NULL)
1520 cbq_deactivate_class(cl);
1521
1522 if (rtab) {
b94c8afc
PM
1523 qdisc_put_rtab(cl->R_tab);
1524 cl->R_tab = rtab;
1da177e4
LT
1525 }
1526
1e90474c
PM
1527 if (tb[TCA_CBQ_LSSOPT])
1528 cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
1da177e4 1529
1e90474c 1530 if (tb[TCA_CBQ_WRROPT]) {
1da177e4 1531 cbq_rmprio(q, cl);
1e90474c 1532 cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
1da177e4
LT
1533 }
1534
1e90474c
PM
1535 if (tb[TCA_CBQ_FOPT])
1536 cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
1da177e4
LT
1537
1538 if (cl->q->q.qlen)
1539 cbq_activate_class(cl);
1540
1541 sch_tree_unlock(sch);
1542
1da177e4
LT
1543 return 0;
1544 }
1545
1546 if (parentid == TC_H_ROOT)
1547 return -EINVAL;
1548
1e90474c
PM
1549 if (tb[TCA_CBQ_WRROPT] == NULL || tb[TCA_CBQ_RATE] == NULL ||
1550 tb[TCA_CBQ_LSSOPT] == NULL)
1da177e4
LT
1551 return -EINVAL;
1552
1e90474c 1553 rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB]);
1da177e4
LT
1554 if (rtab == NULL)
1555 return -EINVAL;
1556
1557 if (classid) {
1558 err = -EINVAL;
cc7ec456
ED
1559 if (TC_H_MAJ(classid ^ sch->handle) ||
1560 cbq_class_lookup(q, classid))
1da177e4
LT
1561 goto failure;
1562 } else {
1563 int i;
cc7ec456 1564 classid = TC_H_MAKE(sch->handle, 0x8000);
1da177e4 1565
cc7ec456 1566 for (i = 0; i < 0x8000; i++) {
1da177e4
LT
1567 if (++q->hgenerator >= 0x8000)
1568 q->hgenerator = 1;
1569 if (cbq_class_lookup(q, classid|q->hgenerator) == NULL)
1570 break;
1571 }
1572 err = -ENOSR;
1573 if (i >= 0x8000)
1574 goto failure;
1575 classid = classid|q->hgenerator;
1576 }
1577
1578 parent = &q->link;
1579 if (parentid) {
1580 parent = cbq_class_lookup(q, parentid);
1581 err = -EINVAL;
1582 if (parent == NULL)
1583 goto failure;
1584 }
1585
1586 err = -ENOBUFS;
0da974f4 1587 cl = kzalloc(sizeof(*cl), GFP_KERNEL);
1da177e4
LT
1588 if (cl == NULL)
1589 goto failure;
71bcb09a 1590
6529eaba
JP
1591 err = tcf_block_get(&cl->block, &cl->filter_list);
1592 if (err) {
1593 kfree(cl);
1594 return err;
1595 }
1596
71bcb09a 1597 if (tca[TCA_RATE]) {
22e0f8b9 1598 err = gen_new_estimator(&cl->bstats, NULL, &cl->rate_est,
edb09eb1
ED
1599 NULL,
1600 qdisc_root_sleeping_running(sch),
71bcb09a
SH
1601 tca[TCA_RATE]);
1602 if (err) {
6529eaba 1603 tcf_block_put(cl->block);
71bcb09a
SH
1604 kfree(cl);
1605 goto failure;
1606 }
1607 }
1608
1da177e4
LT
1609 cl->R_tab = rtab;
1610 rtab = NULL;
1611 cl->refcnt = 1;
3511c913
CG
1612 cl->q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops, classid);
1613 if (!cl->q)
1da177e4 1614 cl->q = &noop_qdisc;
49b49971
JK
1615 else
1616 qdisc_hash_add(cl->q, true);
1617
d77fea2e 1618 cl->common.classid = classid;
1da177e4
LT
1619 cl->tparent = parent;
1620 cl->qdisc = sch;
1621 cl->allot = parent->allot;
1622 cl->quantum = cl->allot;
1623 cl->weight = cl->R_tab->rate.rate;
1da177e4
LT
1624
1625 sch_tree_lock(sch);
1626 cbq_link_class(cl);
1627 cl->borrow = cl->tparent;
1628 if (cl->tparent != &q->link)
1629 cl->share = cl->tparent;
1630 cbq_adjust_levels(parent);
1631 cl->minidle = -0x7FFFFFFF;
1e90474c
PM
1632 cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
1633 cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
cc7ec456 1634 if (cl->ewma_log == 0)
1da177e4 1635 cl->ewma_log = q->link.ewma_log;
cc7ec456 1636 if (cl->maxidle == 0)
1da177e4 1637 cl->maxidle = q->link.maxidle;
cc7ec456 1638 if (cl->avpkt == 0)
1da177e4 1639 cl->avpkt = q->link.avpkt;
1e90474c
PM
1640 if (tb[TCA_CBQ_FOPT])
1641 cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
1da177e4
LT
1642 sch_tree_unlock(sch);
1643
d77fea2e
PM
1644 qdisc_class_hash_grow(sch, &q->clhash);
1645
1da177e4
LT
1646 *arg = (unsigned long)cl;
1647 return 0;
1648
1649failure:
1650 qdisc_put_rtab(rtab);
1651 return err;
1652}
1653
1654static int cbq_delete(struct Qdisc *sch, unsigned long arg)
1655{
1656 struct cbq_sched_data *q = qdisc_priv(sch);
cc7ec456 1657 struct cbq_class *cl = (struct cbq_class *)arg;
2ccccf5f 1658 unsigned int qlen, backlog;
1da177e4
LT
1659
1660 if (cl->filters || cl->children || cl == &q->link)
1661 return -EBUSY;
1662
1663 sch_tree_lock(sch);
1664
a37ef2e3 1665 qlen = cl->q->q.qlen;
2ccccf5f 1666 backlog = cl->q->qstats.backlog;
a37ef2e3 1667 qdisc_reset(cl->q);
2ccccf5f 1668 qdisc_tree_reduce_backlog(cl->q, qlen, backlog);
a37ef2e3 1669
1da177e4
LT
1670 if (cl->next_alive)
1671 cbq_deactivate_class(cl);
1672
1673 if (q->tx_borrowed == cl)
1674 q->tx_borrowed = q->tx_class;
1675 if (q->tx_class == cl) {
1676 q->tx_class = NULL;
1677 q->tx_borrowed = NULL;
1678 }
c3bc7cff 1679#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1680 if (q->rx_class == cl)
1681 q->rx_class = NULL;
1682#endif
1683
1684 cbq_unlink_class(cl);
1685 cbq_adjust_levels(cl->tparent);
1686 cl->defmap = 0;
1687 cbq_sync_defmap(cl);
1688
1689 cbq_rmprio(q, cl);
1690 sch_tree_unlock(sch);
1691
7cd0a638
JP
1692 BUG_ON(--cl->refcnt == 0);
1693 /*
1694 * This shouldn't happen: we "hold" one cops->get() when called
1695 * from tc_ctl_tclass; the destroy method is done from cops->put().
1696 */
1da177e4
LT
1697
1698 return 0;
1699}
1700
6529eaba 1701static struct tcf_block *cbq_tcf_block(struct Qdisc *sch, unsigned long arg)
1da177e4
LT
1702{
1703 struct cbq_sched_data *q = qdisc_priv(sch);
1704 struct cbq_class *cl = (struct cbq_class *)arg;
1705
1706 if (cl == NULL)
1707 cl = &q->link;
1708
6529eaba 1709 return cl->block;
1da177e4
LT
1710}
1711
1712static unsigned long cbq_bind_filter(struct Qdisc *sch, unsigned long parent,
1713 u32 classid)
1714{
1715 struct cbq_sched_data *q = qdisc_priv(sch);
cc7ec456 1716 struct cbq_class *p = (struct cbq_class *)parent;
1da177e4
LT
1717 struct cbq_class *cl = cbq_class_lookup(q, classid);
1718
1719 if (cl) {
1720 if (p && p->level <= cl->level)
1721 return 0;
1722 cl->filters++;
1723 return (unsigned long)cl;
1724 }
1725 return 0;
1726}
1727
1728static void cbq_unbind_filter(struct Qdisc *sch, unsigned long arg)
1729{
cc7ec456 1730 struct cbq_class *cl = (struct cbq_class *)arg;
1da177e4
LT
1731
1732 cl->filters--;
1733}
1734
1735static void cbq_walk(struct Qdisc *sch, struct qdisc_walker *arg)
1736{
1737 struct cbq_sched_data *q = qdisc_priv(sch);
d77fea2e 1738 struct cbq_class *cl;
cc7ec456 1739 unsigned int h;
1da177e4
LT
1740
1741 if (arg->stop)
1742 return;
1743
d77fea2e 1744 for (h = 0; h < q->clhash.hashsize; h++) {
b67bfe0d 1745 hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
1da177e4
LT
1746 if (arg->count < arg->skip) {
1747 arg->count++;
1748 continue;
1749 }
1750 if (arg->fn(sch, (unsigned long)cl, arg) < 0) {
1751 arg->stop = 1;
1752 return;
1753 }
1754 arg->count++;
1755 }
1756 }
1757}
1758
20fea08b 1759static const struct Qdisc_class_ops cbq_class_ops = {
1da177e4
LT
1760 .graft = cbq_graft,
1761 .leaf = cbq_leaf,
a37ef2e3 1762 .qlen_notify = cbq_qlen_notify,
1da177e4
LT
1763 .get = cbq_get,
1764 .put = cbq_put,
1765 .change = cbq_change_class,
1766 .delete = cbq_delete,
1767 .walk = cbq_walk,
6529eaba 1768 .tcf_block = cbq_tcf_block,
1da177e4
LT
1769 .bind_tcf = cbq_bind_filter,
1770 .unbind_tcf = cbq_unbind_filter,
1771 .dump = cbq_dump_class,
1772 .dump_stats = cbq_dump_class_stats,
1773};
1774
20fea08b 1775static struct Qdisc_ops cbq_qdisc_ops __read_mostly = {
1da177e4
LT
1776 .next = NULL,
1777 .cl_ops = &cbq_class_ops,
1778 .id = "cbq",
1779 .priv_size = sizeof(struct cbq_sched_data),
1780 .enqueue = cbq_enqueue,
1781 .dequeue = cbq_dequeue,
77be155c 1782 .peek = qdisc_peek_dequeued,
1da177e4
LT
1783 .init = cbq_init,
1784 .reset = cbq_reset,
1785 .destroy = cbq_destroy,
1786 .change = NULL,
1787 .dump = cbq_dump,
1788 .dump_stats = cbq_dump_stats,
1789 .owner = THIS_MODULE,
1790};
1791
1792static int __init cbq_module_init(void)
1793{
1794 return register_qdisc(&cbq_qdisc_ops);
1795}
10297b99 1796static void __exit cbq_module_exit(void)
1da177e4
LT
1797{
1798 unregister_qdisc(&cbq_qdisc_ops);
1799}
1800module_init(cbq_module_init)
1801module_exit(cbq_module_exit)
1802MODULE_LICENSE("GPL");