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