pkt_sched: Remove qdisc->ops->requeue() etc.
[linux-2.6.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 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_US2NS(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_US2NS(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->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 (cl) {
1625                 if (new == NULL) {
1626                         new = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue,
1627                                                 &pfifo_qdisc_ops,
1628                                                 cl->common.classid);
1629                         if (new == NULL)
1630                                 return -ENOBUFS;
1631                 } else {
1632 #ifdef CONFIG_NET_CLS_ACT
1633                         if (cl->police == TC_POLICE_RECLASSIFY)
1634                                 new->reshape_fail = cbq_reshape_fail;
1635 #endif
1636                 }
1637                 sch_tree_lock(sch);
1638                 *old = xchg(&cl->q, new);
1639                 qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
1640                 qdisc_reset(*old);
1641                 sch_tree_unlock(sch);
1642
1643                 return 0;
1644         }
1645         return -ENOENT;
1646 }
1647
1648 static struct Qdisc *
1649 cbq_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
1656 static 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
1664 static 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
1676 static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl)
1677 {
1678         struct cbq_sched_data *q = qdisc_priv(sch);
1679
1680         WARN_ON(cl->filters);
1681
1682         tcf_destroy_chain(&cl->filter_list);
1683         qdisc_destroy(cl->q);
1684         qdisc_put_rtab(cl->R_tab);
1685         gen_kill_estimator(&cl->bstats, &cl->rate_est);
1686         if (cl != &q->link)
1687                 kfree(cl);
1688 }
1689
1690 static void
1691 cbq_destroy(struct Qdisc* sch)
1692 {
1693         struct cbq_sched_data *q = qdisc_priv(sch);
1694         struct hlist_node *n, *next;
1695         struct cbq_class *cl;
1696         unsigned h;
1697
1698 #ifdef CONFIG_NET_CLS_ACT
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          */
1706         for (h = 0; h < q->clhash.hashsize; h++) {
1707                 hlist_for_each_entry(cl, n, &q->clhash.hash[h], common.hnode)
1708                         tcf_destroy_chain(&cl->filter_list);
1709         }
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)
1713                         cbq_destroy_class(sch, cl);
1714         }
1715         qdisc_class_hash_destroy(&q->clhash);
1716 }
1717
1718 static 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) {
1723 #ifdef CONFIG_NET_CLS_ACT
1724                 spinlock_t *root_lock = qdisc_root_sleeping_lock(sch);
1725                 struct cbq_sched_data *q = qdisc_priv(sch);
1726
1727                 spin_lock_bh(root_lock);
1728                 if (q->rx_class == cl)
1729                         q->rx_class = NULL;
1730                 spin_unlock_bh(root_lock);
1731 #endif
1732
1733                 cbq_destroy_class(sch, cl);
1734         }
1735 }
1736
1737 static int
1738 cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **tca,
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;
1744         struct nlattr *opt = tca[TCA_OPTIONS];
1745         struct nlattr *tb[TCA_CBQ_MAX + 1];
1746         struct cbq_class *parent;
1747         struct qdisc_rate_table *rtab = NULL;
1748
1749         if (opt == NULL)
1750                 return -EINVAL;
1751
1752         err = nla_parse_nested(tb, TCA_CBQ_MAX, opt, cbq_policy);
1753         if (err < 0)
1754                 return err;
1755
1756         if (cl) {
1757                 /* Check parent */
1758                 if (parentid) {
1759                         if (cl->tparent &&
1760                             cl->tparent->common.classid != parentid)
1761                                 return -EINVAL;
1762                         if (!cl->tparent && parentid != TC_H_ROOT)
1763                                 return -EINVAL;
1764                 }
1765
1766                 if (tb[TCA_CBQ_RATE]) {
1767                         rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB]);
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
1783                 if (tb[TCA_CBQ_LSSOPT])
1784                         cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
1785
1786                 if (tb[TCA_CBQ_WRROPT]) {
1787                         cbq_rmprio(q, cl);
1788                         cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
1789                 }
1790
1791                 if (tb[TCA_CBQ_OVL_STRATEGY])
1792                         cbq_set_overlimit(cl, nla_data(tb[TCA_CBQ_OVL_STRATEGY]));
1793
1794 #ifdef CONFIG_NET_CLS_ACT
1795                 if (tb[TCA_CBQ_POLICE])
1796                         cbq_set_police(cl, nla_data(tb[TCA_CBQ_POLICE]));
1797 #endif
1798
1799                 if (tb[TCA_CBQ_FOPT])
1800                         cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
1801
1802                 if (cl->q->q.qlen)
1803                         cbq_activate_class(cl);
1804
1805                 sch_tree_unlock(sch);
1806
1807                 if (tca[TCA_RATE])
1808                         gen_replace_estimator(&cl->bstats, &cl->rate_est,
1809                                               qdisc_root_sleeping_lock(sch),
1810                                               tca[TCA_RATE]);
1811                 return 0;
1812         }
1813
1814         if (parentid == TC_H_ROOT)
1815                 return -EINVAL;
1816
1817         if (tb[TCA_CBQ_WRROPT] == NULL || tb[TCA_CBQ_RATE] == NULL ||
1818             tb[TCA_CBQ_LSSOPT] == NULL)
1819                 return -EINVAL;
1820
1821         rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB]);
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;
1854         cl = kzalloc(sizeof(*cl), GFP_KERNEL);
1855         if (cl == NULL)
1856                 goto failure;
1857         cl->R_tab = rtab;
1858         rtab = NULL;
1859         cl->refcnt = 1;
1860         if (!(cl->q = qdisc_create_dflt(qdisc_dev(sch), sch->dev_queue,
1861                                         &pfifo_qdisc_ops, classid)))
1862                 cl->q = &noop_qdisc;
1863         cl->common.classid = classid;
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;
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;
1877         cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
1878         cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
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;
1886         if (tb[TCA_CBQ_OVL_STRATEGY])
1887                 cbq_set_overlimit(cl, nla_data(tb[TCA_CBQ_OVL_STRATEGY]));
1888 #ifdef CONFIG_NET_CLS_ACT
1889         if (tb[TCA_CBQ_POLICE])
1890                 cbq_set_police(cl, nla_data(tb[TCA_CBQ_POLICE]));
1891 #endif
1892         if (tb[TCA_CBQ_FOPT])
1893                 cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
1894         sch_tree_unlock(sch);
1895
1896         qdisc_class_hash_grow(sch, &q->clhash);
1897
1898         if (tca[TCA_RATE])
1899                 gen_new_estimator(&cl->bstats, &cl->rate_est,
1900                                   qdisc_root_sleeping_lock(sch), tca[TCA_RATE]);
1901
1902         *arg = (unsigned long)cl;
1903         return 0;
1904
1905 failure:
1906         qdisc_put_rtab(rtab);
1907         return err;
1908 }
1909
1910 static 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;
1914         unsigned int qlen;
1915
1916         if (cl->filters || cl->children || cl == &q->link)
1917                 return -EBUSY;
1918
1919         sch_tree_lock(sch);
1920
1921         qlen = cl->q->q.qlen;
1922         qdisc_reset(cl->q);
1923         qdisc_tree_decrease_qlen(cl->q, qlen);
1924
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         }
1934 #ifdef CONFIG_NET_CLS_ACT
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
1953 static 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
1964 static 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
1980 static 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
1987 static void cbq_walk(struct Qdisc *sch, struct qdisc_walker *arg)
1988 {
1989         struct cbq_sched_data *q = qdisc_priv(sch);
1990         struct cbq_class *cl;
1991         struct hlist_node *n;
1992         unsigned h;
1993
1994         if (arg->stop)
1995                 return;
1996
1997         for (h = 0; h < q->clhash.hashsize; h++) {
1998                 hlist_for_each_entry(cl, n, &q->clhash.hash[h], common.hnode) {
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
2012 static const struct Qdisc_class_ops cbq_class_ops = {
2013         .graft          =       cbq_graft,
2014         .leaf           =       cbq_leaf,
2015         .qlen_notify    =       cbq_qlen_notify,
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
2028 static struct Qdisc_ops cbq_qdisc_ops __read_mostly = {
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,
2035         .peek           =       qdisc_peek_dequeued,
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
2046 static int __init cbq_module_init(void)
2047 {
2048         return register_qdisc(&cbq_qdisc_ops);
2049 }
2050 static void __exit cbq_module_exit(void)
2051 {
2052         unregister_qdisc(&cbq_qdisc_ops);
2053 }
2054 module_init(cbq_module_init)
2055 module_exit(cbq_module_exit)
2056 MODULE_LICENSE("GPL");