isdn: isdn_net.c annotate struct ip_ports and trivial sparse fixes
[deliverable/linux.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>
1da177e4
LT
14#include <linux/types.h>
15#include <linux/kernel.h>
1da177e4 16#include <linux/string.h>
1da177e4 17#include <linux/errno.h>
1da177e4 18#include <linux/skbuff.h>
0ba48053 19#include <net/netlink.h>
1da177e4
LT
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
10297b99 27 Management Models for Packet Networks",
1da177e4
LT
28 IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
29
10297b99 30 [2] Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
1da177e4 31
10297b99 32 [3] Sally Floyd, "Notes on Class-Based Queueing: Setting
1da177e4
LT
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
10297b99
YH
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
1da177e4
LT
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
71struct cbq_sched_data;
72
73
74struct cbq_class
75{
d77fea2e 76 struct Qdisc_class_common common;
1da177e4
LT
77 struct cbq_class *next_alive; /* next class with backlog in this priority band */
78
79/* Parameters */
1da177e4
LT
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;
c3bc7cff 84#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
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);
1a13cb63 99 psched_tdiff_t penalty;
1da177e4
LT
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 */
1a13cb63 130 psched_time_t penalized;
1da177e4
LT
131 struct gnet_stats_basic bstats;
132 struct gnet_stats_queue qstats;
133 struct gnet_stats_rate_est rate_est;
1da177e4
LT
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
144struct cbq_sched_data
145{
d77fea2e 146 struct Qdisc_class_hash clhash; /* Hash table of all classes */
1da177e4
LT
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
c3bc7cff 156#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
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
1a13cb63 166 struct hrtimer delay_timer;
88a99354 167 struct qdisc_watchdog watchdog; /* Watchdog timer,
1da177e4
LT
168 started when CBQ has
169 backlog, but cannot
170 transmit just now */
88a99354 171 psched_tdiff_t wd_expires;
1da177e4
LT
172 int toplevel;
173 u32 hgenerator;
174};
175
176
e9bef55d 177#define L2T(cl,len) qdisc_l2t((cl)->R_tab,len)
1da177e4 178
1da177e4
LT
179static __inline__ struct cbq_class *
180cbq_class_lookup(struct cbq_sched_data *q, u32 classid)
181{
d77fea2e 182 struct Qdisc_class_common *clc;
1da177e4 183
d77fea2e
PM
184 clc = qdisc_class_find(&q->clhash, classid);
185 if (clc == NULL)
186 return NULL;
187 return container_of(clc, struct cbq_class, common);
1da177e4
LT
188}
189
c3bc7cff 190#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
191
192static struct cbq_class *
193cbq_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
216static struct cbq_class *
217cbq_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
c27f339a 233 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
1da177e4
LT
234 for (;;) {
235 int result = 0;
236 defmap = head->defaults;
237
238 /*
239 * Step 2+n. Apply classifier.
240 */
73ca4918
PM
241 if (!head->filter_list ||
242 (result = tc_classify_compat(skb, head->filter_list, &res)) < 0)
1da177e4
LT
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:
10297b99 258 case TC_ACT_STOLEN:
378a2f09 259 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
1da177e4
LT
260 case TC_ACT_SHOT:
261 return NULL;
73ca4918
PM
262 case TC_ACT_RECLASSIFY:
263 return cbq_reclassify(skb, cl);
1da177e4 264 }
1da177e4
LT
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
277fallback:
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
297static __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
321static 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 }
1da177e4
LT
342 return;
343 }
344 } while ((cl_prev = cl) != q->active[prio]);
345}
346
347static void
348cbq_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
3bebcda2 356 now = psched_get_time();
8edc0c31 357 incr = now - q->now_rt;
7c59e25f 358 now = q->now + incr;
1da177e4
LT
359
360 do {
104e0878 361 if (cl->undertime < now) {
1da177e4
LT
362 q->toplevel = cl->level;
363 return;
364 }
365 } while ((cl=cl->borrow) != NULL && toplevel > cl->level);
366 }
367}
368
369static int
370cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
371{
372 struct cbq_sched_data *q = qdisc_priv(sch);
ddeee3ce 373 int uninitialized_var(ret);
1da177e4
LT
374 struct cbq_class *cl = cbq_classify(skb, sch, &ret);
375
c3bc7cff 376#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
377 q->rx_class = cl;
378#endif
379 if (cl == NULL) {
c27f339a 380 if (ret & __NET_XMIT_BYPASS)
1da177e4
LT
381 sch->qstats.drops++;
382 kfree_skb(skb);
383 return ret;
384 }
385
c3bc7cff 386#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
387 cl->q->__parent = sch;
388#endif
5f86173b
JK
389 ret = qdisc_enqueue(skb, cl->q);
390 if (ret == NET_XMIT_SUCCESS) {
1da177e4
LT
391 sch->q.qlen++;
392 sch->bstats.packets++;
0abf77e5 393 sch->bstats.bytes += qdisc_pkt_len(skb);
1da177e4
LT
394 cbq_mark_toplevel(q, cl);
395 if (!cl->next_alive)
396 cbq_activate_class(cl);
397 return ret;
398 }
399
378a2f09
JP
400 if (net_xmit_drop_count(ret)) {
401 sch->qstats.drops++;
402 cbq_mark_toplevel(q, cl);
403 cl->qstats.drops++;
404 }
1da177e4
LT
405 return ret;
406}
407
1da177e4
LT
408/* Overlimit actions */
409
410/* TC_CBQ_OVL_CLASSIC: (default) penalize leaf class by adding offtime */
411
412static void cbq_ovl_classic(struct cbq_class *cl)
413{
414 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
8edc0c31 415 psched_tdiff_t delay = cl->undertime - q->now;
1da177e4
LT
416
417 if (!cl->delayed) {
418 delay += cl->offtime;
419
10297b99 420 /*
1da177e4
LT
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;
7c59e25f 433 cl->undertime = q->now + delay;
1da177e4
LT
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) {
8edc0c31 450 delay = b->undertime - q->now;
1da177e4
LT
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
466static 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
485static void cbq_ovl_delay(struct cbq_class *cl)
486{
487 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
8edc0c31 488 psched_tdiff_t delay = cl->undertime - q->now;
1da177e4 489
2540e051
JP
490 if (test_bit(__QDISC_STATE_DEACTIVATED,
491 &qdisc_root_sleeping(cl->qdisc)->state))
492 return;
493
1da177e4 494 if (!cl->delayed) {
1a13cb63
PM
495 psched_time_t sched = q->now;
496 ktime_t expires;
1da177e4
LT
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;
7c59e25f 503 cl->undertime = q->now + delay;
1da177e4
LT
504
505 if (delay > 0) {
1a13cb63 506 sched += delay + cl->penalty;
1da177e4
LT
507 cl->penalized = sched;
508 cl->cpriority = TC_CBQ_MAXPRIO;
509 q->pmask |= (1<<TC_CBQ_MAXPRIO);
1a13cb63
PM
510
511 expires = ktime_set(0, 0);
512 expires = ktime_add_ns(expires, PSCHED_US2NS(sched));
513 if (hrtimer_try_to_cancel(&q->delay_timer) &&
23dd7bb0
AV
514 ktime_to_ns(ktime_sub(
515 hrtimer_get_expires(&q->delay_timer),
516 expires)) > 0)
517 hrtimer_set_expires(&q->delay_timer, expires);
1a13cb63 518 hrtimer_restart(&q->delay_timer);
1da177e4
LT
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
531static void cbq_ovl_lowprio(struct cbq_class *cl)
532{
533 struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
534
1a13cb63 535 cl->penalized = q->now + cl->penalty;
1da177e4
LT
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
547static 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
1a13cb63
PM
556static psched_tdiff_t cbq_undelay_prio(struct cbq_sched_data *q, int prio,
557 psched_time_t now)
1da177e4
LT
558{
559 struct cbq_class *cl;
560 struct cbq_class *cl_prev = q->active[prio];
1a13cb63 561 psched_time_t sched = now;
1da177e4
LT
562
563 if (cl_prev == NULL)
e9054a33 564 return 0;
1da177e4
LT
565
566 do {
567 cl = cl_prev->next_alive;
1a13cb63 568 if (now - cl->penalized > 0) {
1da177e4
LT
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;
1a13cb63 584 } else if (sched - cl->penalized > 0)
1da177e4
LT
585 sched = cl->penalized;
586 } while ((cl_prev = cl) != q->active[prio]);
587
1a13cb63 588 return sched - now;
1da177e4
LT
589}
590
1a13cb63 591static enum hrtimer_restart cbq_undelay(struct hrtimer *timer)
1da177e4 592{
1a13cb63
PM
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;
1da177e4
LT
598 unsigned pmask;
599
3bebcda2 600 now = psched_get_time();
1a13cb63 601
1da177e4
LT
602 pmask = q->pmask;
603 q->pmask = 0;
604
605 while (pmask) {
606 int prio = ffz(~pmask);
1a13cb63 607 psched_tdiff_t tmp;
1da177e4
LT
608
609 pmask &= ~(1<<prio);
610
1a13cb63 611 tmp = cbq_undelay_prio(q, prio, now);
1da177e4
LT
612 if (tmp > 0) {
613 q->pmask |= 1<<prio;
614 if (tmp < delay || delay == 0)
615 delay = tmp;
616 }
617 }
618
619 if (delay) {
1a13cb63
PM
620 ktime_t time;
621
622 time = ktime_set(0, 0);
623 time = ktime_add_ns(time, PSCHED_US2NS(now + delay));
624 hrtimer_start(&q->delay_timer, time, HRTIMER_MODE_ABS);
1da177e4
LT
625 }
626
627 sch->flags &= ~TCQ_F_THROTTLED;
8608db03 628 __netif_schedule(qdisc_root(sch));
1a13cb63 629 return HRTIMER_NORESTART;
1da177e4
LT
630}
631
c3bc7cff 632#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
633static int cbq_reshape_fail(struct sk_buff *skb, struct Qdisc *child)
634{
1da177e4
LT
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) {
378a2f09 642 int ret;
1da177e4
LT
643
644 cbq_mark_toplevel(q, cl);
645
646 q->rx_class = cl;
647 cl->q->__parent = sch;
648
378a2f09
JP
649 ret = qdisc_enqueue(skb, cl->q);
650 if (ret == NET_XMIT_SUCCESS) {
1da177e4
LT
651 sch->q.qlen++;
652 sch->bstats.packets++;
0abf77e5 653 sch->bstats.bytes += qdisc_pkt_len(skb);
1da177e4
LT
654 if (!cl->next_alive)
655 cbq_activate_class(cl);
656 return 0;
657 }
378a2f09
JP
658 if (net_xmit_drop_count(ret))
659 sch->qstats.drops++;
1da177e4
LT
660 return 0;
661 }
662
663 sch->qstats.drops++;
664 return -1;
665}
666#endif
667
10297b99 668/*
1da177e4
LT
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
677static __inline__ void
678cbq_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 {
a084980d 684 if (borrowed->undertime == PSCHED_PASTPERFECT) {
1da177e4
LT
685 q->toplevel = borrowed->level;
686 return;
687 }
688 } while ((borrowed=borrowed->borrow) != NULL);
689 }
10297b99 690#if 0
1da177e4
LT
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
699static void
700cbq_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
10297b99 719 idle = (now - last) - last_pktlen/rate
1da177e4
LT
720 */
721
8edc0c31 722 idle = q->now - cl->last;
1da177e4
LT
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
7c59e25f 766 cl->undertime = q->now + idle;
1da177e4
LT
767 } else {
768 /* Underlimit */
769
a084980d 770 cl->undertime = PSCHED_PASTPERFECT;
1da177e4
LT
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
782static __inline__ struct cbq_class *
783cbq_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
a084980d 791 if (cl->undertime == PSCHED_PASTPERFECT || q->now >= cl->undertime) {
1da177e4
LT
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;
a084980d 814 } while (cl->undertime != PSCHED_PASTPERFECT && q->now < cl->undertime);
1da177e4
LT
815
816 cl->delayed = 0;
817 return cl;
818}
819
820static __inline__ struct sk_buff *
821cbq_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 :-(
10297b99 854 It could occur even if cl->q->q.qlen != 0
1da177e4
LT
855 f.e. if cl->q == "tbf"
856 */
857 if (skb == NULL)
858 goto skip_class;
859
0abf77e5 860 cl->deficit -= qdisc_pkt_len(skb);
1da177e4
LT
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
0abf77e5
JK
868 borrow->xstats.borrows += qdisc_pkt_len(skb);
869 cl->xstats.borrows += qdisc_pkt_len(skb);
1da177e4
LT
870#endif
871 }
0abf77e5 872 q->tx_len = qdisc_pkt_len(skb);
1da177e4
LT
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
881skip_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
912next_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
923static __inline__ struct sk_buff *
924cbq_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
941static struct sk_buff *
942cbq_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
3bebcda2 949 now = psched_get_time();
8edc0c31 950 incr = now - q->now_rt;
1da177e4
LT
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);
7c59e25f 962 q->now += incr2;
1da177e4
LT
963 cbq_update(q);
964 if ((incr -= incr2) < 0)
965 incr = 0;
966 }
7c59e25f 967 q->now += incr;
1da177e4
LT
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 &&
a084980d 999 q->link.undertime == PSCHED_PASTPERFECT)
1da177e4
LT
1000 break;
1001
1002 q->toplevel = TC_CBQ_MAXLEVEL;
a084980d 1003 q->link.undertime = PSCHED_PASTPERFECT;
1da177e4
LT
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++;
88a99354
PM
1011 if (q->wd_expires)
1012 qdisc_watchdog_schedule(&q->watchdog,
bb239acf 1013 now + q->wd_expires);
1da177e4
LT
1014 }
1015 return NULL;
1016}
1017
1018/* CBQ class maintanance routines */
1019
1020static 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
1039static void cbq_normalize_quanta(struct cbq_sched_data *q, int prio)
1040{
1041 struct cbq_class *cl;
d77fea2e
PM
1042 struct hlist_node *n;
1043 unsigned int h;
1da177e4
LT
1044
1045 if (q->quanta[prio] == 0)
1046 return;
1047
d77fea2e
PM
1048 for (h = 0; h < q->clhash.hashsize; h++) {
1049 hlist_for_each_entry(cl, n, &q->clhash.hash[h], common.hnode) {
1da177e4
LT
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 }
5ce2d488 1057 if (cl->quantum <= 0 || cl->quantum>32*qdisc_dev(cl->qdisc)->mtu) {
d77fea2e 1058 printk(KERN_WARNING "CBQ: class %08x has bad quantum==%ld, repaired.\n", cl->common.classid, cl->quantum);
5ce2d488 1059 cl->quantum = qdisc_dev(cl->qdisc)->mtu/2 + 1;
1da177e4
LT
1060 }
1061 }
1062 }
1063}
1064
1065static 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
d77fea2e
PM
1086 for (h = 0; h < q->clhash.hashsize; h++) {
1087 struct hlist_node *n;
1da177e4
LT
1088 struct cbq_class *c;
1089
d77fea2e
PM
1090 hlist_for_each_entry(c, n, &q->clhash.hash[h],
1091 common.hnode) {
1da177e4
LT
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
1102static 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;
d77fea2e 1109 splitid = split->common.classid;
1da177e4
LT
1110 }
1111
d77fea2e 1112 if (split == NULL || split->common.classid != splitid) {
1da177e4 1113 for (split = cl->tparent; split; split = split->tparent)
d77fea2e 1114 if (split->common.classid == splitid)
1da177e4
LT
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
1132static 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
d77fea2e 1137 qdisc_class_hash_remove(&q->clhash, &this->common);
1da177e4
LT
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 {
547b792c 1156 WARN_ON(this->sibling != this);
1da177e4
LT
1157 }
1158}
1159
1160static void cbq_link_class(struct cbq_class *this)
1161{
1162 struct cbq_sched_data *q = qdisc_priv(this->qdisc);
1da177e4
LT
1163 struct cbq_class *parent = this->tparent;
1164
1165 this->sibling = this;
d77fea2e 1166 qdisc_class_hash_insert(&q->clhash, &this->common);
1da177e4
LT
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
1179static 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--;
a37ef2e3
JP
1194 if (!cl->q->q.qlen)
1195 cbq_deactivate_class(cl);
1da177e4
LT
1196 return len;
1197 }
1198 } while ((cl = cl->next_alive) != cl_head);
1199 }
1200 return 0;
1201}
1202
1203static void
1204cbq_reset(struct Qdisc* sch)
1205{
1206 struct cbq_sched_data *q = qdisc_priv(sch);
1207 struct cbq_class *cl;
d77fea2e 1208 struct hlist_node *n;
1da177e4
LT
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;
88a99354 1216 qdisc_watchdog_cancel(&q->watchdog);
1a13cb63 1217 hrtimer_cancel(&q->delay_timer);
1da177e4 1218 q->toplevel = TC_CBQ_MAXLEVEL;
3bebcda2 1219 q->now = psched_get_time();
1da177e4
LT
1220 q->now_rt = q->now;
1221
1222 for (prio = 0; prio <= TC_CBQ_MAXPRIO; prio++)
1223 q->active[prio] = NULL;
1224
d77fea2e
PM
1225 for (h = 0; h < q->clhash.hashsize; h++) {
1226 hlist_for_each_entry(cl, n, &q->clhash.hash[h], common.hnode) {
1da177e4
LT
1227 qdisc_reset(cl->q);
1228
1229 cl->next_alive = NULL;
a084980d 1230 cl->undertime = PSCHED_PASTPERFECT;
1da177e4
LT
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
1240static 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
1261static 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
1268static 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
1275static 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
1294static 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 }
1a13cb63 1319 cl->penalty = ovl->penalty;
1da177e4
LT
1320 return 0;
1321}
1322
c3bc7cff 1323#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1324static 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
1338static 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
27a3421e
PM
1344static 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
1e90474c 1354static int cbq_init(struct Qdisc *sch, struct nlattr *opt)
1da177e4
LT
1355{
1356 struct cbq_sched_data *q = qdisc_priv(sch);
1e90474c 1357 struct nlattr *tb[TCA_CBQ_MAX + 1];
1da177e4 1358 struct tc_ratespec *r;
cee63723
PM
1359 int err;
1360
27a3421e 1361 err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy);
cee63723
PM
1362 if (err < 0)
1363 return err;
1da177e4 1364
27a3421e 1365 if (tb[TCA_CBQ_RTAB] == NULL || tb[TCA_CBQ_RATE] == NULL)
1da177e4
LT
1366 return -EINVAL;
1367
1e90474c 1368 r = nla_data(tb[TCA_CBQ_RATE]);
1da177e4 1369
1e90474c 1370 if ((q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB])) == NULL)
1da177e4
LT
1371 return -EINVAL;
1372
d77fea2e
PM
1373 err = qdisc_class_hash_init(&q->clhash);
1374 if (err < 0)
1375 goto put_rtab;
1376
1da177e4
LT
1377 q->link.refcnt = 1;
1378 q->link.sibling = &q->link;
d77fea2e 1379 q->link.common.classid = sch->handle;
1da177e4 1380 q->link.qdisc = sch;
5ce2d488 1381 if (!(q->link.q = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue,
bb949fbd 1382 &pfifo_qdisc_ops,
9f9afec4 1383 sch->handle)))
1da177e4
LT
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;
5ce2d488 1391 q->link.allot = psched_mtu(qdisc_dev(sch));
1da177e4
LT
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;
1da177e4 1398
88a99354 1399 qdisc_watchdog_init(&q->watchdog, sch);
1a13cb63 1400 hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
1da177e4
LT
1401 q->delay_timer.function = cbq_undelay;
1402 q->toplevel = TC_CBQ_MAXLEVEL;
3bebcda2 1403 q->now = psched_get_time();
1da177e4
LT
1404 q->now_rt = q->now;
1405
1406 cbq_link_class(&q->link);
1407
1e90474c
PM
1408 if (tb[TCA_CBQ_LSSOPT])
1409 cbq_set_lss(&q->link, nla_data(tb[TCA_CBQ_LSSOPT]));
1da177e4
LT
1410
1411 cbq_addprio(q, &q->link);
1412 return 0;
d77fea2e
PM
1413
1414put_rtab:
1415 qdisc_put_rtab(q->link.R_tab);
1416 return err;
1da177e4
LT
1417}
1418
1419static __inline__ int cbq_dump_rate(struct sk_buff *skb, struct cbq_class *cl)
1420{
27a884dc 1421 unsigned char *b = skb_tail_pointer(skb);
1da177e4 1422
1e90474c 1423 NLA_PUT(skb, TCA_CBQ_RATE, sizeof(cl->R_tab->rate), &cl->R_tab->rate);
1da177e4
LT
1424 return skb->len;
1425
1e90474c 1426nla_put_failure:
dc5fc579 1427 nlmsg_trim(skb, b);
1da177e4
LT
1428 return -1;
1429}
1430
1431static __inline__ int cbq_dump_lss(struct sk_buff *skb, struct cbq_class *cl)
1432{
27a884dc 1433 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
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;
1e90474c 1448 NLA_PUT(skb, TCA_CBQ_LSSOPT, sizeof(opt), &opt);
1da177e4
LT
1449 return skb->len;
1450
1e90474c 1451nla_put_failure:
dc5fc579 1452 nlmsg_trim(skb, b);
1da177e4
LT
1453 return -1;
1454}
1455
1456static __inline__ int cbq_dump_wrr(struct sk_buff *skb, struct cbq_class *cl)
1457{
27a884dc 1458 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
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;
1e90474c 1466 NLA_PUT(skb, TCA_CBQ_WRROPT, sizeof(opt), &opt);
1da177e4
LT
1467 return skb->len;
1468
1e90474c 1469nla_put_failure:
dc5fc579 1470 nlmsg_trim(skb, b);
1da177e4
LT
1471 return -1;
1472}
1473
1474static __inline__ int cbq_dump_ovl(struct sk_buff *skb, struct cbq_class *cl)
1475{
27a884dc 1476 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
1477 struct tc_cbq_ovl opt;
1478
1479 opt.strategy = cl->ovl_strategy;
1480 opt.priority2 = cl->priority2+1;
8a47077a 1481 opt.pad = 0;
1a13cb63 1482 opt.penalty = cl->penalty;
1e90474c 1483 NLA_PUT(skb, TCA_CBQ_OVL_STRATEGY, sizeof(opt), &opt);
1da177e4
LT
1484 return skb->len;
1485
1e90474c 1486nla_put_failure:
dc5fc579 1487 nlmsg_trim(skb, b);
1da177e4
LT
1488 return -1;
1489}
1490
1491static __inline__ int cbq_dump_fopt(struct sk_buff *skb, struct cbq_class *cl)
1492{
27a884dc 1493 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
1494 struct tc_cbq_fopt opt;
1495
1496 if (cl->split || cl->defmap) {
d77fea2e 1497 opt.split = cl->split ? cl->split->common.classid : 0;
1da177e4
LT
1498 opt.defmap = cl->defmap;
1499 opt.defchange = ~0;
1e90474c 1500 NLA_PUT(skb, TCA_CBQ_FOPT, sizeof(opt), &opt);
1da177e4
LT
1501 }
1502 return skb->len;
1503
1e90474c 1504nla_put_failure:
dc5fc579 1505 nlmsg_trim(skb, b);
1da177e4
LT
1506 return -1;
1507}
1508
c3bc7cff 1509#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1510static __inline__ int cbq_dump_police(struct sk_buff *skb, struct cbq_class *cl)
1511{
27a884dc 1512 unsigned char *b = skb_tail_pointer(skb);
1da177e4
LT
1513 struct tc_cbq_police opt;
1514
1515 if (cl->police) {
1516 opt.police = cl->police;
9ef1d4c7
PM
1517 opt.__res1 = 0;
1518 opt.__res2 = 0;
1e90474c 1519 NLA_PUT(skb, TCA_CBQ_POLICE, sizeof(opt), &opt);
1da177e4
LT
1520 }
1521 return skb->len;
1522
1e90474c 1523nla_put_failure:
dc5fc579 1524 nlmsg_trim(skb, b);
1da177e4
LT
1525 return -1;
1526}
1527#endif
1528
1529static 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 ||
c3bc7cff 1535#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1536 cbq_dump_police(skb, cl) < 0 ||
1537#endif
1538 cbq_dump_fopt(skb, cl) < 0)
1539 return -1;
1540 return 0;
1541}
1542
1543static int cbq_dump(struct Qdisc *sch, struct sk_buff *skb)
1544{
1545 struct cbq_sched_data *q = qdisc_priv(sch);
4b3550ef 1546 struct nlattr *nest;
1da177e4 1547
4b3550ef
PM
1548 nest = nla_nest_start(skb, TCA_OPTIONS);
1549 if (nest == NULL)
1550 goto nla_put_failure;
1da177e4 1551 if (cbq_dump_attr(skb, &q->link) < 0)
1e90474c 1552 goto nla_put_failure;
4b3550ef 1553 nla_nest_end(skb, nest);
1da177e4
LT
1554 return skb->len;
1555
1e90474c 1556nla_put_failure:
4b3550ef 1557 nla_nest_cancel(skb, nest);
1da177e4
LT
1558 return -1;
1559}
1560
1561static int
1562cbq_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
1570static int
1571cbq_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;
4b3550ef 1575 struct nlattr *nest;
1da177e4
LT
1576
1577 if (cl->tparent)
d77fea2e 1578 tcm->tcm_parent = cl->tparent->common.classid;
1da177e4
LT
1579 else
1580 tcm->tcm_parent = TC_H_ROOT;
d77fea2e 1581 tcm->tcm_handle = cl->common.classid;
1da177e4
LT
1582 tcm->tcm_info = cl->q->handle;
1583
4b3550ef
PM
1584 nest = nla_nest_start(skb, TCA_OPTIONS);
1585 if (nest == NULL)
1586 goto nla_put_failure;
1da177e4 1587 if (cbq_dump_attr(skb, cl) < 0)
1e90474c 1588 goto nla_put_failure;
4b3550ef 1589 nla_nest_end(skb, nest);
1da177e4
LT
1590 return skb->len;
1591
1e90474c 1592nla_put_failure:
4b3550ef 1593 nla_nest_cancel(skb, nest);
1da177e4
LT
1594 return -1;
1595}
1596
1597static int
1598cbq_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
a084980d 1608 if (cl->undertime != PSCHED_PASTPERFECT)
8edc0c31 1609 cl->xstats.undertime = cl->undertime - q->now;
1da177e4
LT
1610
1611 if (gnet_stats_copy_basic(d, &cl->bstats) < 0 ||
1da177e4 1612 gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 ||
1da177e4
LT
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
1619static 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 (cl) {
1625 if (new == NULL) {
5ce2d488 1626 new = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue,
bb949fbd 1627 &pfifo_qdisc_ops,
d77fea2e
PM
1628 cl->common.classid);
1629 if (new == NULL)
1da177e4
LT
1630 return -ENOBUFS;
1631 } else {
c3bc7cff 1632#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1633 if (cl->police == TC_POLICE_RECLASSIFY)
1634 new->reshape_fail = cbq_reshape_fail;
1635#endif
1636 }
1637 sch_tree_lock(sch);
a37ef2e3 1638 *old = xchg(&cl->q, new);
5e50da01 1639 qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
1da177e4
LT
1640 qdisc_reset(*old);
1641 sch_tree_unlock(sch);
1642
1643 return 0;
1644 }
1645 return -ENOENT;
1646}
1647
1648static struct Qdisc *
1649cbq_leaf(struct Qdisc *sch, unsigned long arg)
1650{
1651 struct cbq_class *cl = (struct cbq_class*)arg;
1652
1653 return cl ? cl->q : NULL;
1654}
1655
a37ef2e3
JP
1656static void cbq_qlen_notify(struct Qdisc *sch, unsigned long arg)
1657{
1658 struct cbq_class *cl = (struct cbq_class *)arg;
1659
1660 if (cl->q->q.qlen == 0)
1661 cbq_deactivate_class(cl);
1662}
1663
1da177e4
LT
1664static unsigned long cbq_get(struct Qdisc *sch, u32 classid)
1665{
1666 struct cbq_sched_data *q = qdisc_priv(sch);
1667 struct cbq_class *cl = cbq_class_lookup(q, classid);
1668
1669 if (cl) {
1670 cl->refcnt++;
1671 return (unsigned long)cl;
1672 }
1673 return 0;
1674}
1675
1da177e4
LT
1676static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl)
1677{
1678 struct cbq_sched_data *q = qdisc_priv(sch);
1679
547b792c 1680 WARN_ON(cl->filters);
1da177e4 1681
ff31ab56 1682 tcf_destroy_chain(&cl->filter_list);
1da177e4
LT
1683 qdisc_destroy(cl->q);
1684 qdisc_put_rtab(cl->R_tab);
1da177e4 1685 gen_kill_estimator(&cl->bstats, &cl->rate_est);
1da177e4
LT
1686 if (cl != &q->link)
1687 kfree(cl);
1688}
1689
1690static void
1691cbq_destroy(struct Qdisc* sch)
1692{
1693 struct cbq_sched_data *q = qdisc_priv(sch);
d77fea2e 1694 struct hlist_node *n, *next;
1da177e4
LT
1695 struct cbq_class *cl;
1696 unsigned h;
1697
c3bc7cff 1698#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1699 q->rx_class = NULL;
1700#endif
1701 /*
1702 * Filters must be destroyed first because we don't destroy the
1703 * classes from root to leafs which means that filters can still
1704 * be bound to classes which have been destroyed already. --TGR '04
1705 */
d77fea2e
PM
1706 for (h = 0; h < q->clhash.hashsize; h++) {
1707 hlist_for_each_entry(cl, n, &q->clhash.hash[h], common.hnode)
ff31ab56 1708 tcf_destroy_chain(&cl->filter_list);
b00b4bf9 1709 }
d77fea2e
PM
1710 for (h = 0; h < q->clhash.hashsize; h++) {
1711 hlist_for_each_entry_safe(cl, n, next, &q->clhash.hash[h],
1712 common.hnode)
1da177e4 1713 cbq_destroy_class(sch, cl);
1da177e4 1714 }
d77fea2e 1715 qdisc_class_hash_destroy(&q->clhash);
1da177e4
LT
1716}
1717
1718static void cbq_put(struct Qdisc *sch, unsigned long arg)
1719{
1720 struct cbq_class *cl = (struct cbq_class*)arg;
1721
1722 if (--cl->refcnt == 0) {
c3bc7cff 1723#ifdef CONFIG_NET_CLS_ACT
102396ae 1724 spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
1da177e4
LT
1725 struct cbq_sched_data *q = qdisc_priv(sch);
1726
7698b4fc 1727 spin_lock_bh(root_lock);
1da177e4
LT
1728 if (q->rx_class == cl)
1729 q->rx_class = NULL;
7698b4fc 1730 spin_unlock_bh(root_lock);
1da177e4
LT
1731#endif
1732
1733 cbq_destroy_class(sch, cl);
1734 }
1735}
1736
1737static int
1e90474c 1738cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **tca,
1da177e4
LT
1739 unsigned long *arg)
1740{
1741 int err;
1742 struct cbq_sched_data *q = qdisc_priv(sch);
1743 struct cbq_class *cl = (struct cbq_class*)*arg;
1e90474c
PM
1744 struct nlattr *opt = tca[TCA_OPTIONS];
1745 struct nlattr *tb[TCA_CBQ_MAX + 1];
1da177e4
LT
1746 struct cbq_class *parent;
1747 struct qdisc_rate_table *rtab = NULL;
1748
cee63723 1749 if (opt == NULL)
1da177e4
LT
1750 return -EINVAL;
1751
27a3421e 1752 err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy);
cee63723
PM
1753 if (err < 0)
1754 return err;
1755
1da177e4
LT
1756 if (cl) {
1757 /* Check parent */
1758 if (parentid) {
d77fea2e
PM
1759 if (cl->tparent &&
1760 cl->tparent->common.classid != parentid)
1da177e4
LT
1761 return -EINVAL;
1762 if (!cl->tparent && parentid != TC_H_ROOT)
1763 return -EINVAL;
1764 }
1765
1e90474c
PM
1766 if (tb[TCA_CBQ_RATE]) {
1767 rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB]);
1da177e4
LT
1768 if (rtab == NULL)
1769 return -EINVAL;
1770 }
1771
1772 /* Change class parameters */
1773 sch_tree_lock(sch);
1774
1775 if (cl->next_alive != NULL)
1776 cbq_deactivate_class(cl);
1777
1778 if (rtab) {
1779 rtab = xchg(&cl->R_tab, rtab);
1780 qdisc_put_rtab(rtab);
1781 }
1782
1e90474c
PM
1783 if (tb[TCA_CBQ_LSSOPT])
1784 cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
1da177e4 1785
1e90474c 1786 if (tb[TCA_CBQ_WRROPT]) {
1da177e4 1787 cbq_rmprio(q, cl);
1e90474c 1788 cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
1da177e4
LT
1789 }
1790
1e90474c
PM
1791 if (tb[TCA_CBQ_OVL_STRATEGY])
1792 cbq_set_overlimit(cl, nla_data(tb[TCA_CBQ_OVL_STRATEGY]));
1da177e4 1793
c3bc7cff 1794#ifdef CONFIG_NET_CLS_ACT
1e90474c
PM
1795 if (tb[TCA_CBQ_POLICE])
1796 cbq_set_police(cl, nla_data(tb[TCA_CBQ_POLICE]));
1da177e4
LT
1797#endif
1798
1e90474c
PM
1799 if (tb[TCA_CBQ_FOPT])
1800 cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
1da177e4
LT
1801
1802 if (cl->q->q.qlen)
1803 cbq_activate_class(cl);
1804
1805 sch_tree_unlock(sch);
1806
1e90474c 1807 if (tca[TCA_RATE])
1da177e4 1808 gen_replace_estimator(&cl->bstats, &cl->rate_est,
f6f9b93f 1809 qdisc_root_sleeping_lock(sch),
1e90474c 1810 tca[TCA_RATE]);
1da177e4
LT
1811 return 0;
1812 }
1813
1814 if (parentid == TC_H_ROOT)
1815 return -EINVAL;
1816
1e90474c
PM
1817 if (tb[TCA_CBQ_WRROPT] == NULL || tb[TCA_CBQ_RATE] == NULL ||
1818 tb[TCA_CBQ_LSSOPT] == NULL)
1da177e4
LT
1819 return -EINVAL;
1820
1e90474c 1821 rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB]);
1da177e4
LT
1822 if (rtab == NULL)
1823 return -EINVAL;
1824
1825 if (classid) {
1826 err = -EINVAL;
1827 if (TC_H_MAJ(classid^sch->handle) || cbq_class_lookup(q, classid))
1828 goto failure;
1829 } else {
1830 int i;
1831 classid = TC_H_MAKE(sch->handle,0x8000);
1832
1833 for (i=0; i<0x8000; i++) {
1834 if (++q->hgenerator >= 0x8000)
1835 q->hgenerator = 1;
1836 if (cbq_class_lookup(q, classid|q->hgenerator) == NULL)
1837 break;
1838 }
1839 err = -ENOSR;
1840 if (i >= 0x8000)
1841 goto failure;
1842 classid = classid|q->hgenerator;
1843 }
1844
1845 parent = &q->link;
1846 if (parentid) {
1847 parent = cbq_class_lookup(q, parentid);
1848 err = -EINVAL;
1849 if (parent == NULL)
1850 goto failure;
1851 }
1852
1853 err = -ENOBUFS;
0da974f4 1854 cl = kzalloc(sizeof(*cl), GFP_KERNEL);
1da177e4
LT
1855 if (cl == NULL)
1856 goto failure;
1da177e4
LT
1857 cl->R_tab = rtab;
1858 rtab = NULL;
1859 cl->refcnt = 1;
5ce2d488 1860 if (!(cl->q = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue,
bb949fbd 1861 &pfifo_qdisc_ops, classid)))
1da177e4 1862 cl->q = &noop_qdisc;
d77fea2e 1863 cl->common.classid = classid;
1da177e4
LT
1864 cl->tparent = parent;
1865 cl->qdisc = sch;
1866 cl->allot = parent->allot;
1867 cl->quantum = cl->allot;
1868 cl->weight = cl->R_tab->rate.rate;
1da177e4
LT
1869
1870 sch_tree_lock(sch);
1871 cbq_link_class(cl);
1872 cl->borrow = cl->tparent;
1873 if (cl->tparent != &q->link)
1874 cl->share = cl->tparent;
1875 cbq_adjust_levels(parent);
1876 cl->minidle = -0x7FFFFFFF;
1e90474c
PM
1877 cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
1878 cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
1da177e4
LT
1879 if (cl->ewma_log==0)
1880 cl->ewma_log = q->link.ewma_log;
1881 if (cl->maxidle==0)
1882 cl->maxidle = q->link.maxidle;
1883 if (cl->avpkt==0)
1884 cl->avpkt = q->link.avpkt;
1885 cl->overlimit = cbq_ovl_classic;
1e90474c
PM
1886 if (tb[TCA_CBQ_OVL_STRATEGY])
1887 cbq_set_overlimit(cl, nla_data(tb[TCA_CBQ_OVL_STRATEGY]));
c3bc7cff 1888#ifdef CONFIG_NET_CLS_ACT
1e90474c
PM
1889 if (tb[TCA_CBQ_POLICE])
1890 cbq_set_police(cl, nla_data(tb[TCA_CBQ_POLICE]));
1da177e4 1891#endif
1e90474c
PM
1892 if (tb[TCA_CBQ_FOPT])
1893 cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
1da177e4
LT
1894 sch_tree_unlock(sch);
1895
d77fea2e
PM
1896 qdisc_class_hash_grow(sch, &q->clhash);
1897
1e90474c 1898 if (tca[TCA_RATE])
1da177e4 1899 gen_new_estimator(&cl->bstats, &cl->rate_est,
f6f9b93f 1900 qdisc_root_sleeping_lock(sch), tca[TCA_RATE]);
1da177e4
LT
1901
1902 *arg = (unsigned long)cl;
1903 return 0;
1904
1905failure:
1906 qdisc_put_rtab(rtab);
1907 return err;
1908}
1909
1910static int cbq_delete(struct Qdisc *sch, unsigned long arg)
1911{
1912 struct cbq_sched_data *q = qdisc_priv(sch);
1913 struct cbq_class *cl = (struct cbq_class*)arg;
a37ef2e3 1914 unsigned int qlen;
1da177e4
LT
1915
1916 if (cl->filters || cl->children || cl == &q->link)
1917 return -EBUSY;
1918
1919 sch_tree_lock(sch);
1920
a37ef2e3
JP
1921 qlen = cl->q->q.qlen;
1922 qdisc_reset(cl->q);
1923 qdisc_tree_decrease_qlen(cl->q, qlen);
1924
1da177e4
LT
1925 if (cl->next_alive)
1926 cbq_deactivate_class(cl);
1927
1928 if (q->tx_borrowed == cl)
1929 q->tx_borrowed = q->tx_class;
1930 if (q->tx_class == cl) {
1931 q->tx_class = NULL;
1932 q->tx_borrowed = NULL;
1933 }
c3bc7cff 1934#ifdef CONFIG_NET_CLS_ACT
1da177e4
LT
1935 if (q->rx_class == cl)
1936 q->rx_class = NULL;
1937#endif
1938
1939 cbq_unlink_class(cl);
1940 cbq_adjust_levels(cl->tparent);
1941 cl->defmap = 0;
1942 cbq_sync_defmap(cl);
1943
1944 cbq_rmprio(q, cl);
1945 sch_tree_unlock(sch);
1946
1947 if (--cl->refcnt == 0)
1948 cbq_destroy_class(sch, cl);
1949
1950 return 0;
1951}
1952
1953static struct tcf_proto **cbq_find_tcf(struct Qdisc *sch, unsigned long arg)
1954{
1955 struct cbq_sched_data *q = qdisc_priv(sch);
1956 struct cbq_class *cl = (struct cbq_class *)arg;
1957
1958 if (cl == NULL)
1959 cl = &q->link;
1960
1961 return &cl->filter_list;
1962}
1963
1964static unsigned long cbq_bind_filter(struct Qdisc *sch, unsigned long parent,
1965 u32 classid)
1966{
1967 struct cbq_sched_data *q = qdisc_priv(sch);
1968 struct cbq_class *p = (struct cbq_class*)parent;
1969 struct cbq_class *cl = cbq_class_lookup(q, classid);
1970
1971 if (cl) {
1972 if (p && p->level <= cl->level)
1973 return 0;
1974 cl->filters++;
1975 return (unsigned long)cl;
1976 }
1977 return 0;
1978}
1979
1980static void cbq_unbind_filter(struct Qdisc *sch, unsigned long arg)
1981{
1982 struct cbq_class *cl = (struct cbq_class*)arg;
1983
1984 cl->filters--;
1985}
1986
1987static void cbq_walk(struct Qdisc *sch, struct qdisc_walker *arg)
1988{
1989 struct cbq_sched_data *q = qdisc_priv(sch);
d77fea2e
PM
1990 struct cbq_class *cl;
1991 struct hlist_node *n;
1da177e4
LT
1992 unsigned h;
1993
1994 if (arg->stop)
1995 return;
1996
d77fea2e
PM
1997 for (h = 0; h < q->clhash.hashsize; h++) {
1998 hlist_for_each_entry(cl, n, &q->clhash.hash[h], common.hnode) {
1da177e4
LT
1999 if (arg->count < arg->skip) {
2000 arg->count++;
2001 continue;
2002 }
2003 if (arg->fn(sch, (unsigned long)cl, arg) < 0) {
2004 arg->stop = 1;
2005 return;
2006 }
2007 arg->count++;
2008 }
2009 }
2010}
2011
20fea08b 2012static const struct Qdisc_class_ops cbq_class_ops = {
1da177e4
LT
2013 .graft = cbq_graft,
2014 .leaf = cbq_leaf,
a37ef2e3 2015 .qlen_notify = cbq_qlen_notify,
1da177e4
LT
2016 .get = cbq_get,
2017 .put = cbq_put,
2018 .change = cbq_change_class,
2019 .delete = cbq_delete,
2020 .walk = cbq_walk,
2021 .tcf_chain = cbq_find_tcf,
2022 .bind_tcf = cbq_bind_filter,
2023 .unbind_tcf = cbq_unbind_filter,
2024 .dump = cbq_dump_class,
2025 .dump_stats = cbq_dump_class_stats,
2026};
2027
20fea08b 2028static struct Qdisc_ops cbq_qdisc_ops __read_mostly = {
1da177e4
LT
2029 .next = NULL,
2030 .cl_ops = &cbq_class_ops,
2031 .id = "cbq",
2032 .priv_size = sizeof(struct cbq_sched_data),
2033 .enqueue = cbq_enqueue,
2034 .dequeue = cbq_dequeue,
77be155c 2035 .peek = qdisc_peek_dequeued,
1da177e4
LT
2036 .drop = cbq_drop,
2037 .init = cbq_init,
2038 .reset = cbq_reset,
2039 .destroy = cbq_destroy,
2040 .change = NULL,
2041 .dump = cbq_dump,
2042 .dump_stats = cbq_dump_stats,
2043 .owner = THIS_MODULE,
2044};
2045
2046static int __init cbq_module_init(void)
2047{
2048 return register_qdisc(&cbq_qdisc_ops);
2049}
10297b99 2050static void __exit cbq_module_exit(void)
1da177e4
LT
2051{
2052 unregister_qdisc(&cbq_qdisc_ops);
2053}
2054module_init(cbq_module_init)
2055module_exit(cbq_module_exit)
2056MODULE_LICENSE("GPL");
This page took 0.494165 seconds and 5 git commands to generate.