net-sched: sch_htb: use dynamic class hash helpers
[safe/jmp/linux-2.6] / net / sched / sch_htb.c
1 /*
2  * net/sched/sch_htb.c  Hierarchical token bucket, feed tree version
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:     Martin Devera, <devik@cdi.cz>
10  *
11  * Credits (in time order) for older HTB versions:
12  *              Stef Coene <stef.coene@docum.org>
13  *                      HTB support at LARTC mailing list
14  *              Ondrej Kraus, <krauso@barr.cz>
15  *                      found missing INIT_QDISC(htb)
16  *              Vladimir Smelhaus, Aamer Akhter, Bert Hubert
17  *                      helped a lot to locate nasty class stall bug
18  *              Andi Kleen, Jamal Hadi, Bert Hubert
19  *                      code review and helpful comments on shaping
20  *              Tomasz Wrona, <tw@eter.tym.pl>
21  *                      created test case so that I was able to fix nasty bug
22  *              Wilfried Weissmann
23  *                      spotted bug in dequeue code and helped with fix
24  *              Jiri Fojtasek
25  *                      fixed requeue routine
26  *              and many others. thanks.
27  */
28 #include <linux/module.h>
29 #include <linux/moduleparam.h>
30 #include <linux/types.h>
31 #include <linux/kernel.h>
32 #include <linux/string.h>
33 #include <linux/errno.h>
34 #include <linux/skbuff.h>
35 #include <linux/list.h>
36 #include <linux/compiler.h>
37 #include <linux/rbtree.h>
38 #include <net/netlink.h>
39 #include <net/pkt_sched.h>
40
41 /* HTB algorithm.
42     Author: devik@cdi.cz
43     ========================================================================
44     HTB is like TBF with multiple classes. It is also similar to CBQ because
45     it allows to assign priority to each class in hierarchy.
46     In fact it is another implementation of Floyd's formal sharing.
47
48     Levels:
49     Each class is assigned level. Leaf has ALWAYS level 0 and root
50     classes have level TC_HTB_MAXDEPTH-1. Interior nodes has level
51     one less than their parent.
52 */
53
54 static int htb_hysteresis __read_mostly = 0; /* whether to use mode hysteresis for speedup */
55 #define HTB_VER 0x30011         /* major must be matched with number suplied by TC as version */
56
57 #if HTB_VER >> 16 != TC_HTB_PROTOVER
58 #error "Mismatched sch_htb.c and pkt_sch.h"
59 #endif
60
61 /* Module parameter and sysfs export */
62 module_param    (htb_hysteresis, int, 0640);
63 MODULE_PARM_DESC(htb_hysteresis, "Hysteresis mode, less CPU load, less accurate");
64
65 /* used internaly to keep status of single class */
66 enum htb_cmode {
67         HTB_CANT_SEND,          /* class can't send and can't borrow */
68         HTB_MAY_BORROW,         /* class can't send but may borrow */
69         HTB_CAN_SEND            /* class can send */
70 };
71
72 /* interior & leaf nodes; props specific to leaves are marked L: */
73 struct htb_class {
74         struct Qdisc_class_common common;
75         /* general class parameters */
76         struct gnet_stats_basic bstats;
77         struct gnet_stats_queue qstats;
78         struct gnet_stats_rate_est rate_est;
79         struct tc_htb_xstats xstats;    /* our special stats */
80         int refcnt;             /* usage count of this class */
81
82         /* topology */
83         int level;              /* our level (see above) */
84         struct htb_class *parent;       /* parent class */
85         struct list_head sibling;       /* sibling list item */
86         struct list_head children;      /* children list */
87
88         union {
89                 struct htb_class_leaf {
90                         struct Qdisc *q;
91                         int prio;
92                         int aprio;
93                         int quantum;
94                         int deficit[TC_HTB_MAXDEPTH];
95                         struct list_head drop_list;
96                 } leaf;
97                 struct htb_class_inner {
98                         struct rb_root feed[TC_HTB_NUMPRIO];    /* feed trees */
99                         struct rb_node *ptr[TC_HTB_NUMPRIO];    /* current class ptr */
100                         /* When class changes from state 1->2 and disconnects from
101                            parent's feed then we lost ptr value and start from the
102                            first child again. Here we store classid of the
103                            last valid ptr (used when ptr is NULL). */
104                         u32 last_ptr_id[TC_HTB_NUMPRIO];
105                 } inner;
106         } un;
107         struct rb_node node[TC_HTB_NUMPRIO];    /* node for self or feed tree */
108         struct rb_node pq_node; /* node for event queue */
109         psched_time_t pq_key;
110
111         int prio_activity;      /* for which prios are we active */
112         enum htb_cmode cmode;   /* current mode of the class */
113
114         /* class attached filters */
115         struct tcf_proto *filter_list;
116         int filter_cnt;
117
118         int warned;             /* only one warning about non work conserving .. */
119
120         /* token bucket parameters */
121         struct qdisc_rate_table *rate;  /* rate table of the class itself */
122         struct qdisc_rate_table *ceil;  /* ceiling rate (limits borrows too) */
123         long buffer, cbuffer;   /* token bucket depth/rate */
124         psched_tdiff_t mbuffer; /* max wait time */
125         long tokens, ctokens;   /* current number of tokens */
126         psched_time_t t_c;      /* checkpoint time */
127
128         int prio;               /* For parent to leaf return possible here */
129         int quantum;            /* we do backup. Finally full replacement  */
130                                 /* of un.leaf originals should be done. */
131 };
132
133 static inline long L2T(struct htb_class *cl, struct qdisc_rate_table *rate,
134                            int size)
135 {
136         long result = qdisc_l2t(rate, size);
137         return result;
138 }
139
140 struct htb_sched {
141         struct list_head root;  /* root classes list */
142         struct Qdisc_class_hash clhash;
143         struct list_head drops[TC_HTB_NUMPRIO];/* active leaves (for drops) */
144
145         /* self list - roots of self generating tree */
146         struct rb_root row[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
147         int row_mask[TC_HTB_MAXDEPTH];
148         struct rb_node *ptr[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
149         u32 last_ptr_id[TC_HTB_MAXDEPTH][TC_HTB_NUMPRIO];
150
151         /* self wait list - roots of wait PQs per row */
152         struct rb_root wait_pq[TC_HTB_MAXDEPTH];
153
154         /* time of nearest event per level (row) */
155         psched_time_t near_ev_cache[TC_HTB_MAXDEPTH];
156
157         /* whether we hit non-work conserving class during this dequeue; we use */
158         int nwc_hit;            /* this to disable mindelay complaint in dequeue */
159
160         int defcls;             /* class where unclassified flows go to */
161
162         /* filters for qdisc itself */
163         struct tcf_proto *filter_list;
164         int filter_cnt;
165
166         int rate2quantum;       /* quant = rate / rate2quantum */
167         psched_time_t now;      /* cached dequeue time */
168         struct qdisc_watchdog watchdog;
169
170         /* non shaped skbs; let them go directly thru */
171         struct sk_buff_head direct_queue;
172         int direct_qlen;        /* max qlen of above */
173
174         long direct_pkts;
175 };
176
177 /* find class in global hash table using given handle */
178 static inline struct htb_class *htb_find(u32 handle, struct Qdisc *sch)
179 {
180         struct htb_sched *q = qdisc_priv(sch);
181         struct Qdisc_class_common *clc;
182
183         clc = qdisc_class_find(&q->clhash, handle);
184         if (clc == NULL)
185                 return NULL;
186         return container_of(clc, struct htb_class, common);
187 }
188
189 /**
190  * htb_classify - classify a packet into class
191  *
192  * It returns NULL if the packet should be dropped or -1 if the packet
193  * should be passed directly thru. In all other cases leaf class is returned.
194  * We allow direct class selection by classid in priority. The we examine
195  * filters in qdisc and in inner nodes (if higher filter points to the inner
196  * node). If we end up with classid MAJOR:0 we enqueue the skb into special
197  * internal fifo (direct). These packets then go directly thru. If we still
198  * have no valid leaf we try to use MAJOR:default leaf. It still unsuccessfull
199  * then finish and return direct queue.
200  */
201 #define HTB_DIRECT (struct htb_class*)-1
202
203 static struct htb_class *htb_classify(struct sk_buff *skb, struct Qdisc *sch,
204                                       int *qerr)
205 {
206         struct htb_sched *q = qdisc_priv(sch);
207         struct htb_class *cl;
208         struct tcf_result res;
209         struct tcf_proto *tcf;
210         int result;
211
212         /* allow to select class by setting skb->priority to valid classid;
213            note that nfmark can be used too by attaching filter fw with no
214            rules in it */
215         if (skb->priority == sch->handle)
216                 return HTB_DIRECT;      /* X:0 (direct flow) selected */
217         if ((cl = htb_find(skb->priority, sch)) != NULL && cl->level == 0)
218                 return cl;
219
220         *qerr = NET_XMIT_BYPASS;
221         tcf = q->filter_list;
222         while (tcf && (result = tc_classify(skb, tcf, &res)) >= 0) {
223 #ifdef CONFIG_NET_CLS_ACT
224                 switch (result) {
225                 case TC_ACT_QUEUED:
226                 case TC_ACT_STOLEN:
227                         *qerr = NET_XMIT_SUCCESS;
228                 case TC_ACT_SHOT:
229                         return NULL;
230                 }
231 #endif
232                 if ((cl = (void *)res.class) == NULL) {
233                         if (res.classid == sch->handle)
234                                 return HTB_DIRECT;      /* X:0 (direct flow) */
235                         if ((cl = htb_find(res.classid, sch)) == NULL)
236                                 break;  /* filter selected invalid classid */
237                 }
238                 if (!cl->level)
239                         return cl;      /* we hit leaf; return it */
240
241                 /* we have got inner class; apply inner filter chain */
242                 tcf = cl->filter_list;
243         }
244         /* classification failed; try to use default class */
245         cl = htb_find(TC_H_MAKE(TC_H_MAJ(sch->handle), q->defcls), sch);
246         if (!cl || cl->level)
247                 return HTB_DIRECT;      /* bad default .. this is safe bet */
248         return cl;
249 }
250
251 /**
252  * htb_add_to_id_tree - adds class to the round robin list
253  *
254  * Routine adds class to the list (actually tree) sorted by classid.
255  * Make sure that class is not already on such list for given prio.
256  */
257 static void htb_add_to_id_tree(struct rb_root *root,
258                                struct htb_class *cl, int prio)
259 {
260         struct rb_node **p = &root->rb_node, *parent = NULL;
261
262         while (*p) {
263                 struct htb_class *c;
264                 parent = *p;
265                 c = rb_entry(parent, struct htb_class, node[prio]);
266
267                 if (cl->common.classid > c->common.classid)
268                         p = &parent->rb_right;
269                 else
270                         p = &parent->rb_left;
271         }
272         rb_link_node(&cl->node[prio], parent, p);
273         rb_insert_color(&cl->node[prio], root);
274 }
275
276 /**
277  * htb_add_to_wait_tree - adds class to the event queue with delay
278  *
279  * The class is added to priority event queue to indicate that class will
280  * change its mode in cl->pq_key microseconds. Make sure that class is not
281  * already in the queue.
282  */
283 static void htb_add_to_wait_tree(struct htb_sched *q,
284                                  struct htb_class *cl, long delay)
285 {
286         struct rb_node **p = &q->wait_pq[cl->level].rb_node, *parent = NULL;
287
288         cl->pq_key = q->now + delay;
289         if (cl->pq_key == q->now)
290                 cl->pq_key++;
291
292         /* update the nearest event cache */
293         if (q->near_ev_cache[cl->level] > cl->pq_key)
294                 q->near_ev_cache[cl->level] = cl->pq_key;
295
296         while (*p) {
297                 struct htb_class *c;
298                 parent = *p;
299                 c = rb_entry(parent, struct htb_class, pq_node);
300                 if (cl->pq_key >= c->pq_key)
301                         p = &parent->rb_right;
302                 else
303                         p = &parent->rb_left;
304         }
305         rb_link_node(&cl->pq_node, parent, p);
306         rb_insert_color(&cl->pq_node, &q->wait_pq[cl->level]);
307 }
308
309 /**
310  * htb_next_rb_node - finds next node in binary tree
311  *
312  * When we are past last key we return NULL.
313  * Average complexity is 2 steps per call.
314  */
315 static inline void htb_next_rb_node(struct rb_node **n)
316 {
317         *n = rb_next(*n);
318 }
319
320 /**
321  * htb_add_class_to_row - add class to its row
322  *
323  * The class is added to row at priorities marked in mask.
324  * It does nothing if mask == 0.
325  */
326 static inline void htb_add_class_to_row(struct htb_sched *q,
327                                         struct htb_class *cl, int mask)
328 {
329         q->row_mask[cl->level] |= mask;
330         while (mask) {
331                 int prio = ffz(~mask);
332                 mask &= ~(1 << prio);
333                 htb_add_to_id_tree(q->row[cl->level] + prio, cl, prio);
334         }
335 }
336
337 /* If this triggers, it is a bug in this code, but it need not be fatal */
338 static void htb_safe_rb_erase(struct rb_node *rb, struct rb_root *root)
339 {
340         if (RB_EMPTY_NODE(rb)) {
341                 WARN_ON(1);
342         } else {
343                 rb_erase(rb, root);
344                 RB_CLEAR_NODE(rb);
345         }
346 }
347
348
349 /**
350  * htb_remove_class_from_row - removes class from its row
351  *
352  * The class is removed from row at priorities marked in mask.
353  * It does nothing if mask == 0.
354  */
355 static inline void htb_remove_class_from_row(struct htb_sched *q,
356                                                  struct htb_class *cl, int mask)
357 {
358         int m = 0;
359
360         while (mask) {
361                 int prio = ffz(~mask);
362
363                 mask &= ~(1 << prio);
364                 if (q->ptr[cl->level][prio] == cl->node + prio)
365                         htb_next_rb_node(q->ptr[cl->level] + prio);
366
367                 htb_safe_rb_erase(cl->node + prio, q->row[cl->level] + prio);
368                 if (!q->row[cl->level][prio].rb_node)
369                         m |= 1 << prio;
370         }
371         q->row_mask[cl->level] &= ~m;
372 }
373
374 /**
375  * htb_activate_prios - creates active classe's feed chain
376  *
377  * The class is connected to ancestors and/or appropriate rows
378  * for priorities it is participating on. cl->cmode must be new
379  * (activated) mode. It does nothing if cl->prio_activity == 0.
380  */
381 static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl)
382 {
383         struct htb_class *p = cl->parent;
384         long m, mask = cl->prio_activity;
385
386         while (cl->cmode == HTB_MAY_BORROW && p && mask) {
387                 m = mask;
388                 while (m) {
389                         int prio = ffz(~m);
390                         m &= ~(1 << prio);
391
392                         if (p->un.inner.feed[prio].rb_node)
393                                 /* parent already has its feed in use so that
394                                    reset bit in mask as parent is already ok */
395                                 mask &= ~(1 << prio);
396
397                         htb_add_to_id_tree(p->un.inner.feed + prio, cl, prio);
398                 }
399                 p->prio_activity |= mask;
400                 cl = p;
401                 p = cl->parent;
402
403         }
404         if (cl->cmode == HTB_CAN_SEND && mask)
405                 htb_add_class_to_row(q, cl, mask);
406 }
407
408 /**
409  * htb_deactivate_prios - remove class from feed chain
410  *
411  * cl->cmode must represent old mode (before deactivation). It does
412  * nothing if cl->prio_activity == 0. Class is removed from all feed
413  * chains and rows.
414  */
415 static void htb_deactivate_prios(struct htb_sched *q, struct htb_class *cl)
416 {
417         struct htb_class *p = cl->parent;
418         long m, mask = cl->prio_activity;
419
420         while (cl->cmode == HTB_MAY_BORROW && p && mask) {
421                 m = mask;
422                 mask = 0;
423                 while (m) {
424                         int prio = ffz(~m);
425                         m &= ~(1 << prio);
426
427                         if (p->un.inner.ptr[prio] == cl->node + prio) {
428                                 /* we are removing child which is pointed to from
429                                    parent feed - forget the pointer but remember
430                                    classid */
431                                 p->un.inner.last_ptr_id[prio] = cl->common.classid;
432                                 p->un.inner.ptr[prio] = NULL;
433                         }
434
435                         htb_safe_rb_erase(cl->node + prio, p->un.inner.feed + prio);
436
437                         if (!p->un.inner.feed[prio].rb_node)
438                                 mask |= 1 << prio;
439                 }
440
441                 p->prio_activity &= ~mask;
442                 cl = p;
443                 p = cl->parent;
444
445         }
446         if (cl->cmode == HTB_CAN_SEND && mask)
447                 htb_remove_class_from_row(q, cl, mask);
448 }
449
450 static inline long htb_lowater(const struct htb_class *cl)
451 {
452         if (htb_hysteresis)
453                 return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0;
454         else
455                 return 0;
456 }
457 static inline long htb_hiwater(const struct htb_class *cl)
458 {
459         if (htb_hysteresis)
460                 return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0;
461         else
462                 return 0;
463 }
464
465
466 /**
467  * htb_class_mode - computes and returns current class mode
468  *
469  * It computes cl's mode at time cl->t_c+diff and returns it. If mode
470  * is not HTB_CAN_SEND then cl->pq_key is updated to time difference
471  * from now to time when cl will change its state.
472  * Also it is worth to note that class mode doesn't change simply
473  * at cl->{c,}tokens == 0 but there can rather be hysteresis of
474  * 0 .. -cl->{c,}buffer range. It is meant to limit number of
475  * mode transitions per time unit. The speed gain is about 1/6.
476  */
477 static inline enum htb_cmode
478 htb_class_mode(struct htb_class *cl, long *diff)
479 {
480         long toks;
481
482         if ((toks = (cl->ctokens + *diff)) < htb_lowater(cl)) {
483                 *diff = -toks;
484                 return HTB_CANT_SEND;
485         }
486
487         if ((toks = (cl->tokens + *diff)) >= htb_hiwater(cl))
488                 return HTB_CAN_SEND;
489
490         *diff = -toks;
491         return HTB_MAY_BORROW;
492 }
493
494 /**
495  * htb_change_class_mode - changes classe's mode
496  *
497  * This should be the only way how to change classe's mode under normal
498  * cirsumstances. Routine will update feed lists linkage, change mode
499  * and add class to the wait event queue if appropriate. New mode should
500  * be different from old one and cl->pq_key has to be valid if changing
501  * to mode other than HTB_CAN_SEND (see htb_add_to_wait_tree).
502  */
503 static void
504 htb_change_class_mode(struct htb_sched *q, struct htb_class *cl, long *diff)
505 {
506         enum htb_cmode new_mode = htb_class_mode(cl, diff);
507
508         if (new_mode == cl->cmode)
509                 return;
510
511         if (cl->prio_activity) {        /* not necessary: speed optimization */
512                 if (cl->cmode != HTB_CANT_SEND)
513                         htb_deactivate_prios(q, cl);
514                 cl->cmode = new_mode;
515                 if (new_mode != HTB_CANT_SEND)
516                         htb_activate_prios(q, cl);
517         } else
518                 cl->cmode = new_mode;
519 }
520
521 /**
522  * htb_activate - inserts leaf cl into appropriate active feeds
523  *
524  * Routine learns (new) priority of leaf and activates feed chain
525  * for the prio. It can be called on already active leaf safely.
526  * It also adds leaf into droplist.
527  */
528 static inline void htb_activate(struct htb_sched *q, struct htb_class *cl)
529 {
530         BUG_TRAP(!cl->level && cl->un.leaf.q && cl->un.leaf.q->q.qlen);
531
532         if (!cl->prio_activity) {
533                 cl->prio_activity = 1 << (cl->un.leaf.aprio = cl->un.leaf.prio);
534                 htb_activate_prios(q, cl);
535                 list_add_tail(&cl->un.leaf.drop_list,
536                               q->drops + cl->un.leaf.aprio);
537         }
538 }
539
540 /**
541  * htb_deactivate - remove leaf cl from active feeds
542  *
543  * Make sure that leaf is active. In the other words it can't be called
544  * with non-active leaf. It also removes class from the drop list.
545  */
546 static inline void htb_deactivate(struct htb_sched *q, struct htb_class *cl)
547 {
548         BUG_TRAP(cl->prio_activity);
549
550         htb_deactivate_prios(q, cl);
551         cl->prio_activity = 0;
552         list_del_init(&cl->un.leaf.drop_list);
553 }
554
555 static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
556 {
557         int ret;
558         struct htb_sched *q = qdisc_priv(sch);
559         struct htb_class *cl = htb_classify(skb, sch, &ret);
560
561         if (cl == HTB_DIRECT) {
562                 /* enqueue to helper queue */
563                 if (q->direct_queue.qlen < q->direct_qlen) {
564                         __skb_queue_tail(&q->direct_queue, skb);
565                         q->direct_pkts++;
566                 } else {
567                         kfree_skb(skb);
568                         sch->qstats.drops++;
569                         return NET_XMIT_DROP;
570                 }
571 #ifdef CONFIG_NET_CLS_ACT
572         } else if (!cl) {
573                 if (ret == NET_XMIT_BYPASS)
574                         sch->qstats.drops++;
575                 kfree_skb(skb);
576                 return ret;
577 #endif
578         } else if (cl->un.leaf.q->enqueue(skb, cl->un.leaf.q) !=
579                    NET_XMIT_SUCCESS) {
580                 sch->qstats.drops++;
581                 cl->qstats.drops++;
582                 return NET_XMIT_DROP;
583         } else {
584                 cl->bstats.packets +=
585                         skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1;
586                 cl->bstats.bytes += skb->len;
587                 htb_activate(q, cl);
588         }
589
590         sch->q.qlen++;
591         sch->bstats.packets += skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1;
592         sch->bstats.bytes += skb->len;
593         return NET_XMIT_SUCCESS;
594 }
595
596 /* TODO: requeuing packet charges it to policers again !! */
597 static int htb_requeue(struct sk_buff *skb, struct Qdisc *sch)
598 {
599         int ret;
600         struct htb_sched *q = qdisc_priv(sch);
601         struct htb_class *cl = htb_classify(skb, sch, &ret);
602         struct sk_buff *tskb;
603
604         if (cl == HTB_DIRECT) {
605                 /* enqueue to helper queue */
606                 if (q->direct_queue.qlen < q->direct_qlen) {
607                         __skb_queue_head(&q->direct_queue, skb);
608                 } else {
609                         __skb_queue_head(&q->direct_queue, skb);
610                         tskb = __skb_dequeue_tail(&q->direct_queue);
611                         kfree_skb(tskb);
612                         sch->qstats.drops++;
613                         return NET_XMIT_CN;
614                 }
615 #ifdef CONFIG_NET_CLS_ACT
616         } else if (!cl) {
617                 if (ret == NET_XMIT_BYPASS)
618                         sch->qstats.drops++;
619                 kfree_skb(skb);
620                 return ret;
621 #endif
622         } else if (cl->un.leaf.q->ops->requeue(skb, cl->un.leaf.q) !=
623                    NET_XMIT_SUCCESS) {
624                 sch->qstats.drops++;
625                 cl->qstats.drops++;
626                 return NET_XMIT_DROP;
627         } else
628                 htb_activate(q, cl);
629
630         sch->q.qlen++;
631         sch->qstats.requeues++;
632         return NET_XMIT_SUCCESS;
633 }
634
635 /**
636  * htb_charge_class - charges amount "bytes" to leaf and ancestors
637  *
638  * Routine assumes that packet "bytes" long was dequeued from leaf cl
639  * borrowing from "level". It accounts bytes to ceil leaky bucket for
640  * leaf and all ancestors and to rate bucket for ancestors at levels
641  * "level" and higher. It also handles possible change of mode resulting
642  * from the update. Note that mode can also increase here (MAY_BORROW to
643  * CAN_SEND) because we can use more precise clock that event queue here.
644  * In such case we remove class from event queue first.
645  */
646 static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,
647                              int level, struct sk_buff *skb)
648 {
649         int bytes = skb->len;
650         long toks, diff;
651         enum htb_cmode old_mode;
652
653 #define HTB_ACCNT(T,B,R) toks = diff + cl->T; \
654         if (toks > cl->B) toks = cl->B; \
655         toks -= L2T(cl, cl->R, bytes); \
656         if (toks <= -cl->mbuffer) toks = 1-cl->mbuffer; \
657         cl->T = toks
658
659         while (cl) {
660                 diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
661                 if (cl->level >= level) {
662                         if (cl->level == level)
663                                 cl->xstats.lends++;
664                         HTB_ACCNT(tokens, buffer, rate);
665                 } else {
666                         cl->xstats.borrows++;
667                         cl->tokens += diff;     /* we moved t_c; update tokens */
668                 }
669                 HTB_ACCNT(ctokens, cbuffer, ceil);
670                 cl->t_c = q->now;
671
672                 old_mode = cl->cmode;
673                 diff = 0;
674                 htb_change_class_mode(q, cl, &diff);
675                 if (old_mode != cl->cmode) {
676                         if (old_mode != HTB_CAN_SEND)
677                                 htb_safe_rb_erase(&cl->pq_node, q->wait_pq + cl->level);
678                         if (cl->cmode != HTB_CAN_SEND)
679                                 htb_add_to_wait_tree(q, cl, diff);
680                 }
681
682                 /* update byte stats except for leaves which are already updated */
683                 if (cl->level) {
684                         cl->bstats.bytes += bytes;
685                         cl->bstats.packets += skb_is_gso(skb)?
686                                         skb_shinfo(skb)->gso_segs:1;
687                 }
688                 cl = cl->parent;
689         }
690 }
691
692 /**
693  * htb_do_events - make mode changes to classes at the level
694  *
695  * Scans event queue for pending events and applies them. Returns time of
696  * next pending event (0 for no event in pq).
697  * Note: Applied are events whose have cl->pq_key <= q->now.
698  */
699 static psched_time_t htb_do_events(struct htb_sched *q, int level)
700 {
701         /* don't run for longer than 2 jiffies; 2 is used instead of
702            1 to simplify things when jiffy is going to be incremented
703            too soon */
704         unsigned long stop_at = jiffies + 2;
705         while (time_before(jiffies, stop_at)) {
706                 struct htb_class *cl;
707                 long diff;
708                 struct rb_node *p = rb_first(&q->wait_pq[level]);
709
710                 if (!p)
711                         return 0;
712
713                 cl = rb_entry(p, struct htb_class, pq_node);
714                 if (cl->pq_key > q->now)
715                         return cl->pq_key;
716
717                 htb_safe_rb_erase(p, q->wait_pq + level);
718                 diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
719                 htb_change_class_mode(q, cl, &diff);
720                 if (cl->cmode != HTB_CAN_SEND)
721                         htb_add_to_wait_tree(q, cl, diff);
722         }
723         /* too much load - let's continue on next jiffie */
724         return q->now + PSCHED_TICKS_PER_SEC / HZ;
725 }
726
727 /* Returns class->node+prio from id-tree where classe's id is >= id. NULL
728    is no such one exists. */
729 static struct rb_node *htb_id_find_next_upper(int prio, struct rb_node *n,
730                                               u32 id)
731 {
732         struct rb_node *r = NULL;
733         while (n) {
734                 struct htb_class *cl =
735                     rb_entry(n, struct htb_class, node[prio]);
736                 if (id == cl->common.classid)
737                         return n;
738
739                 if (id > cl->common.classid) {
740                         n = n->rb_right;
741                 } else {
742                         r = n;
743                         n = n->rb_left;
744                 }
745         }
746         return r;
747 }
748
749 /**
750  * htb_lookup_leaf - returns next leaf class in DRR order
751  *
752  * Find leaf where current feed pointers points to.
753  */
754 static struct htb_class *htb_lookup_leaf(struct rb_root *tree, int prio,
755                                          struct rb_node **pptr, u32 * pid)
756 {
757         int i;
758         struct {
759                 struct rb_node *root;
760                 struct rb_node **pptr;
761                 u32 *pid;
762         } stk[TC_HTB_MAXDEPTH], *sp = stk;
763
764         BUG_TRAP(tree->rb_node);
765         sp->root = tree->rb_node;
766         sp->pptr = pptr;
767         sp->pid = pid;
768
769         for (i = 0; i < 65535; i++) {
770                 if (!*sp->pptr && *sp->pid) {
771                         /* ptr was invalidated but id is valid - try to recover
772                            the original or next ptr */
773                         *sp->pptr =
774                             htb_id_find_next_upper(prio, sp->root, *sp->pid);
775                 }
776                 *sp->pid = 0;   /* ptr is valid now so that remove this hint as it
777                                    can become out of date quickly */
778                 if (!*sp->pptr) {       /* we are at right end; rewind & go up */
779                         *sp->pptr = sp->root;
780                         while ((*sp->pptr)->rb_left)
781                                 *sp->pptr = (*sp->pptr)->rb_left;
782                         if (sp > stk) {
783                                 sp--;
784                                 BUG_TRAP(*sp->pptr);
785                                 if (!*sp->pptr)
786                                         return NULL;
787                                 htb_next_rb_node(sp->pptr);
788                         }
789                 } else {
790                         struct htb_class *cl;
791                         cl = rb_entry(*sp->pptr, struct htb_class, node[prio]);
792                         if (!cl->level)
793                                 return cl;
794                         (++sp)->root = cl->un.inner.feed[prio].rb_node;
795                         sp->pptr = cl->un.inner.ptr + prio;
796                         sp->pid = cl->un.inner.last_ptr_id + prio;
797                 }
798         }
799         BUG_TRAP(0);
800         return NULL;
801 }
802
803 /* dequeues packet at given priority and level; call only if
804    you are sure that there is active class at prio/level */
805 static struct sk_buff *htb_dequeue_tree(struct htb_sched *q, int prio,
806                                         int level)
807 {
808         struct sk_buff *skb = NULL;
809         struct htb_class *cl, *start;
810         /* look initial class up in the row */
811         start = cl = htb_lookup_leaf(q->row[level] + prio, prio,
812                                      q->ptr[level] + prio,
813                                      q->last_ptr_id[level] + prio);
814
815         do {
816 next:
817                 BUG_TRAP(cl);
818                 if (!cl)
819                         return NULL;
820
821                 /* class can be empty - it is unlikely but can be true if leaf
822                    qdisc drops packets in enqueue routine or if someone used
823                    graft operation on the leaf since last dequeue;
824                    simply deactivate and skip such class */
825                 if (unlikely(cl->un.leaf.q->q.qlen == 0)) {
826                         struct htb_class *next;
827                         htb_deactivate(q, cl);
828
829                         /* row/level might become empty */
830                         if ((q->row_mask[level] & (1 << prio)) == 0)
831                                 return NULL;
832
833                         next = htb_lookup_leaf(q->row[level] + prio,
834                                                prio, q->ptr[level] + prio,
835                                                q->last_ptr_id[level] + prio);
836
837                         if (cl == start)        /* fix start if we just deleted it */
838                                 start = next;
839                         cl = next;
840                         goto next;
841                 }
842
843                 skb = cl->un.leaf.q->dequeue(cl->un.leaf.q);
844                 if (likely(skb != NULL))
845                         break;
846                 if (!cl->warned) {
847                         printk(KERN_WARNING
848                                "htb: class %X isn't work conserving ?!\n",
849                                cl->common.classid);
850                         cl->warned = 1;
851                 }
852                 q->nwc_hit++;
853                 htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
854                                   ptr[0]) + prio);
855                 cl = htb_lookup_leaf(q->row[level] + prio, prio,
856                                      q->ptr[level] + prio,
857                                      q->last_ptr_id[level] + prio);
858
859         } while (cl != start);
860
861         if (likely(skb != NULL)) {
862                 if ((cl->un.leaf.deficit[level] -= skb->len) < 0) {
863                         cl->un.leaf.deficit[level] += cl->un.leaf.quantum;
864                         htb_next_rb_node((level ? cl->parent->un.inner.ptr : q->
865                                           ptr[0]) + prio);
866                 }
867                 /* this used to be after charge_class but this constelation
868                    gives us slightly better performance */
869                 if (!cl->un.leaf.q->q.qlen)
870                         htb_deactivate(q, cl);
871                 htb_charge_class(q, cl, level, skb);
872         }
873         return skb;
874 }
875
876 static struct sk_buff *htb_dequeue(struct Qdisc *sch)
877 {
878         struct sk_buff *skb = NULL;
879         struct htb_sched *q = qdisc_priv(sch);
880         int level;
881         psched_time_t next_event;
882
883         /* try to dequeue direct packets as high prio (!) to minimize cpu work */
884         skb = __skb_dequeue(&q->direct_queue);
885         if (skb != NULL) {
886                 sch->flags &= ~TCQ_F_THROTTLED;
887                 sch->q.qlen--;
888                 return skb;
889         }
890
891         if (!sch->q.qlen)
892                 goto fin;
893         q->now = psched_get_time();
894
895         next_event = q->now + 5 * PSCHED_TICKS_PER_SEC;
896         q->nwc_hit = 0;
897         for (level = 0; level < TC_HTB_MAXDEPTH; level++) {
898                 /* common case optimization - skip event handler quickly */
899                 int m;
900                 psched_time_t event;
901
902                 if (q->now >= q->near_ev_cache[level]) {
903                         event = htb_do_events(q, level);
904                         if (!event)
905                                 event = q->now + PSCHED_TICKS_PER_SEC;
906                         q->near_ev_cache[level] = event;
907                 } else
908                         event = q->near_ev_cache[level];
909
910                 if (event && next_event > event)
911                         next_event = event;
912
913                 m = ~q->row_mask[level];
914                 while (m != (int)(-1)) {
915                         int prio = ffz(m);
916                         m |= 1 << prio;
917                         skb = htb_dequeue_tree(q, prio, level);
918                         if (likely(skb != NULL)) {
919                                 sch->q.qlen--;
920                                 sch->flags &= ~TCQ_F_THROTTLED;
921                                 goto fin;
922                         }
923                 }
924         }
925         sch->qstats.overlimits++;
926         qdisc_watchdog_schedule(&q->watchdog, next_event);
927 fin:
928         return skb;
929 }
930
931 /* try to drop from each class (by prio) until one succeed */
932 static unsigned int htb_drop(struct Qdisc *sch)
933 {
934         struct htb_sched *q = qdisc_priv(sch);
935         int prio;
936
937         for (prio = TC_HTB_NUMPRIO - 1; prio >= 0; prio--) {
938                 struct list_head *p;
939                 list_for_each(p, q->drops + prio) {
940                         struct htb_class *cl = list_entry(p, struct htb_class,
941                                                           un.leaf.drop_list);
942                         unsigned int len;
943                         if (cl->un.leaf.q->ops->drop &&
944                             (len = cl->un.leaf.q->ops->drop(cl->un.leaf.q))) {
945                                 sch->q.qlen--;
946                                 if (!cl->un.leaf.q->q.qlen)
947                                         htb_deactivate(q, cl);
948                                 return len;
949                         }
950                 }
951         }
952         return 0;
953 }
954
955 /* reset all classes */
956 /* always caled under BH & queue lock */
957 static void htb_reset(struct Qdisc *sch)
958 {
959         struct htb_sched *q = qdisc_priv(sch);
960         struct htb_class *cl;
961         struct hlist_node *n;
962         unsigned int i;
963
964         for (i = 0; i < q->clhash.hashsize; i++) {
965                 hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode) {
966                         if (cl->level)
967                                 memset(&cl->un.inner, 0, sizeof(cl->un.inner));
968                         else {
969                                 if (cl->un.leaf.q)
970                                         qdisc_reset(cl->un.leaf.q);
971                                 INIT_LIST_HEAD(&cl->un.leaf.drop_list);
972                         }
973                         cl->prio_activity = 0;
974                         cl->cmode = HTB_CAN_SEND;
975
976                 }
977         }
978         qdisc_watchdog_cancel(&q->watchdog);
979         __skb_queue_purge(&q->direct_queue);
980         sch->q.qlen = 0;
981         memset(q->row, 0, sizeof(q->row));
982         memset(q->row_mask, 0, sizeof(q->row_mask));
983         memset(q->wait_pq, 0, sizeof(q->wait_pq));
984         memset(q->ptr, 0, sizeof(q->ptr));
985         for (i = 0; i < TC_HTB_NUMPRIO; i++)
986                 INIT_LIST_HEAD(q->drops + i);
987 }
988
989 static const struct nla_policy htb_policy[TCA_HTB_MAX + 1] = {
990         [TCA_HTB_PARMS] = { .len = sizeof(struct tc_htb_opt) },
991         [TCA_HTB_INIT]  = { .len = sizeof(struct tc_htb_glob) },
992         [TCA_HTB_CTAB]  = { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
993         [TCA_HTB_RTAB]  = { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
994 };
995
996 static int htb_init(struct Qdisc *sch, struct nlattr *opt)
997 {
998         struct htb_sched *q = qdisc_priv(sch);
999         struct nlattr *tb[TCA_HTB_INIT + 1];
1000         struct tc_htb_glob *gopt;
1001         int err;
1002         int i;
1003
1004         if (!opt)
1005                 return -EINVAL;
1006
1007         err = nla_parse_nested(tb, TCA_HTB_INIT, opt, htb_policy);
1008         if (err < 0)
1009                 return err;
1010
1011         if (tb[TCA_HTB_INIT] == NULL) {
1012                 printk(KERN_ERR "HTB: hey probably you have bad tc tool ?\n");
1013                 return -EINVAL;
1014         }
1015         gopt = nla_data(tb[TCA_HTB_INIT]);
1016         if (gopt->version != HTB_VER >> 16) {
1017                 printk(KERN_ERR
1018                        "HTB: need tc/htb version %d (minor is %d), you have %d\n",
1019                        HTB_VER >> 16, HTB_VER & 0xffff, gopt->version);
1020                 return -EINVAL;
1021         }
1022
1023         INIT_LIST_HEAD(&q->root);
1024         err = qdisc_class_hash_init(&q->clhash);
1025         if (err < 0)
1026                 return err;
1027         for (i = 0; i < TC_HTB_NUMPRIO; i++)
1028                 INIT_LIST_HEAD(q->drops + i);
1029
1030         qdisc_watchdog_init(&q->watchdog, sch);
1031         skb_queue_head_init(&q->direct_queue);
1032
1033         q->direct_qlen = sch->dev->tx_queue_len;
1034         if (q->direct_qlen < 2) /* some devices have zero tx_queue_len */
1035                 q->direct_qlen = 2;
1036
1037         if ((q->rate2quantum = gopt->rate2quantum) < 1)
1038                 q->rate2quantum = 1;
1039         q->defcls = gopt->defcls;
1040
1041         return 0;
1042 }
1043
1044 static int htb_dump(struct Qdisc *sch, struct sk_buff *skb)
1045 {
1046         struct htb_sched *q = qdisc_priv(sch);
1047         struct nlattr *nest;
1048         struct tc_htb_glob gopt;
1049
1050         spin_lock_bh(&sch->dev->queue_lock);
1051
1052         gopt.direct_pkts = q->direct_pkts;
1053         gopt.version = HTB_VER;
1054         gopt.rate2quantum = q->rate2quantum;
1055         gopt.defcls = q->defcls;
1056         gopt.debug = 0;
1057
1058         nest = nla_nest_start(skb, TCA_OPTIONS);
1059         if (nest == NULL)
1060                 goto nla_put_failure;
1061         NLA_PUT(skb, TCA_HTB_INIT, sizeof(gopt), &gopt);
1062         nla_nest_end(skb, nest);
1063
1064         spin_unlock_bh(&sch->dev->queue_lock);
1065         return skb->len;
1066
1067 nla_put_failure:
1068         spin_unlock_bh(&sch->dev->queue_lock);
1069         nla_nest_cancel(skb, nest);
1070         return -1;
1071 }
1072
1073 static int htb_dump_class(struct Qdisc *sch, unsigned long arg,
1074                           struct sk_buff *skb, struct tcmsg *tcm)
1075 {
1076         struct htb_class *cl = (struct htb_class *)arg;
1077         struct nlattr *nest;
1078         struct tc_htb_opt opt;
1079
1080         spin_lock_bh(&sch->dev->queue_lock);
1081         tcm->tcm_parent = cl->parent ? cl->parent->common.classid : TC_H_ROOT;
1082         tcm->tcm_handle = cl->common.classid;
1083         if (!cl->level && cl->un.leaf.q)
1084                 tcm->tcm_info = cl->un.leaf.q->handle;
1085
1086         nest = nla_nest_start(skb, TCA_OPTIONS);
1087         if (nest == NULL)
1088                 goto nla_put_failure;
1089
1090         memset(&opt, 0, sizeof(opt));
1091
1092         opt.rate = cl->rate->rate;
1093         opt.buffer = cl->buffer;
1094         opt.ceil = cl->ceil->rate;
1095         opt.cbuffer = cl->cbuffer;
1096         opt.quantum = cl->un.leaf.quantum;
1097         opt.prio = cl->un.leaf.prio;
1098         opt.level = cl->level;
1099         NLA_PUT(skb, TCA_HTB_PARMS, sizeof(opt), &opt);
1100
1101         nla_nest_end(skb, nest);
1102         spin_unlock_bh(&sch->dev->queue_lock);
1103         return skb->len;
1104
1105 nla_put_failure:
1106         spin_unlock_bh(&sch->dev->queue_lock);
1107         nla_nest_cancel(skb, nest);
1108         return -1;
1109 }
1110
1111 static int
1112 htb_dump_class_stats(struct Qdisc *sch, unsigned long arg, struct gnet_dump *d)
1113 {
1114         struct htb_class *cl = (struct htb_class *)arg;
1115
1116         if (!cl->level && cl->un.leaf.q)
1117                 cl->qstats.qlen = cl->un.leaf.q->q.qlen;
1118         cl->xstats.tokens = cl->tokens;
1119         cl->xstats.ctokens = cl->ctokens;
1120
1121         if (gnet_stats_copy_basic(d, &cl->bstats) < 0 ||
1122             gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 ||
1123             gnet_stats_copy_queue(d, &cl->qstats) < 0)
1124                 return -1;
1125
1126         return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats));
1127 }
1128
1129 static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
1130                      struct Qdisc **old)
1131 {
1132         struct htb_class *cl = (struct htb_class *)arg;
1133
1134         if (cl && !cl->level) {
1135                 if (new == NULL &&
1136                     (new = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops,
1137                                              cl->common.classid))
1138                     == NULL)
1139                         return -ENOBUFS;
1140                 sch_tree_lock(sch);
1141                 if ((*old = xchg(&cl->un.leaf.q, new)) != NULL) {
1142                         qdisc_tree_decrease_qlen(*old, (*old)->q.qlen);
1143                         qdisc_reset(*old);
1144                 }
1145                 sch_tree_unlock(sch);
1146                 return 0;
1147         }
1148         return -ENOENT;
1149 }
1150
1151 static struct Qdisc *htb_leaf(struct Qdisc *sch, unsigned long arg)
1152 {
1153         struct htb_class *cl = (struct htb_class *)arg;
1154         return (cl && !cl->level) ? cl->un.leaf.q : NULL;
1155 }
1156
1157 static void htb_qlen_notify(struct Qdisc *sch, unsigned long arg)
1158 {
1159         struct htb_class *cl = (struct htb_class *)arg;
1160
1161         if (cl->un.leaf.q->q.qlen == 0)
1162                 htb_deactivate(qdisc_priv(sch), cl);
1163 }
1164
1165 static unsigned long htb_get(struct Qdisc *sch, u32 classid)
1166 {
1167         struct htb_class *cl = htb_find(classid, sch);
1168         if (cl)
1169                 cl->refcnt++;
1170         return (unsigned long)cl;
1171 }
1172
1173 static inline int htb_parent_last_child(struct htb_class *cl)
1174 {
1175         if (!cl->parent)
1176                 /* the root class */
1177                 return 0;
1178
1179         if (!(cl->parent->children.next == &cl->sibling &&
1180                 cl->parent->children.prev == &cl->sibling))
1181                 /* not the last child */
1182                 return 0;
1183
1184         return 1;
1185 }
1186
1187 static void htb_parent_to_leaf(struct htb_sched *q, struct htb_class *cl,
1188                                struct Qdisc *new_q)
1189 {
1190         struct htb_class *parent = cl->parent;
1191
1192         BUG_TRAP(!cl->level && cl->un.leaf.q && !cl->prio_activity);
1193
1194         if (parent->cmode != HTB_CAN_SEND)
1195                 htb_safe_rb_erase(&parent->pq_node, q->wait_pq + parent->level);
1196
1197         parent->level = 0;
1198         memset(&parent->un.inner, 0, sizeof(parent->un.inner));
1199         INIT_LIST_HEAD(&parent->un.leaf.drop_list);
1200         parent->un.leaf.q = new_q ? new_q : &noop_qdisc;
1201         parent->un.leaf.quantum = parent->quantum;
1202         parent->un.leaf.prio = parent->prio;
1203         parent->tokens = parent->buffer;
1204         parent->ctokens = parent->cbuffer;
1205         parent->t_c = psched_get_time();
1206         parent->cmode = HTB_CAN_SEND;
1207 }
1208
1209 static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl)
1210 {
1211         if (!cl->level) {
1212                 BUG_TRAP(cl->un.leaf.q);
1213                 qdisc_destroy(cl->un.leaf.q);
1214         }
1215         gen_kill_estimator(&cl->bstats, &cl->rate_est);
1216         qdisc_put_rtab(cl->rate);
1217         qdisc_put_rtab(cl->ceil);
1218
1219         tcf_destroy_chain(&cl->filter_list);
1220         kfree(cl);
1221 }
1222
1223 /* always caled under BH & queue lock */
1224 static void htb_destroy(struct Qdisc *sch)
1225 {
1226         struct htb_sched *q = qdisc_priv(sch);
1227         struct hlist_node *n, *next;
1228         struct htb_class *cl;
1229         unsigned int i;
1230
1231         qdisc_watchdog_cancel(&q->watchdog);
1232         /* This line used to be after htb_destroy_class call below
1233            and surprisingly it worked in 2.4. But it must precede it
1234            because filter need its target class alive to be able to call
1235            unbind_filter on it (without Oops). */
1236         tcf_destroy_chain(&q->filter_list);
1237
1238         for (i = 0; i < q->clhash.hashsize; i++) {
1239                 hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode)
1240                         tcf_destroy_chain(&cl->filter_list);
1241         }
1242         for (i = 0; i < q->clhash.hashsize; i++) {
1243                 hlist_for_each_entry_safe(cl, n, next, &q->clhash.hash[i],
1244                                           common.hnode)
1245                         htb_destroy_class(sch, cl);
1246         }
1247         qdisc_class_hash_destroy(&q->clhash);
1248         __skb_queue_purge(&q->direct_queue);
1249 }
1250
1251 static int htb_delete(struct Qdisc *sch, unsigned long arg)
1252 {
1253         struct htb_sched *q = qdisc_priv(sch);
1254         struct htb_class *cl = (struct htb_class *)arg;
1255         unsigned int qlen;
1256         struct Qdisc *new_q = NULL;
1257         int last_child = 0;
1258
1259         // TODO: why don't allow to delete subtree ? references ? does
1260         // tc subsys quarantee us that in htb_destroy it holds no class
1261         // refs so that we can remove children safely there ?
1262         if (!list_empty(&cl->children) || cl->filter_cnt)
1263                 return -EBUSY;
1264
1265         if (!cl->level && htb_parent_last_child(cl)) {
1266                 new_q = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops,
1267                                                 cl->parent->common.classid);
1268                 last_child = 1;
1269         }
1270
1271         sch_tree_lock(sch);
1272
1273         if (!cl->level) {
1274                 qlen = cl->un.leaf.q->q.qlen;
1275                 qdisc_reset(cl->un.leaf.q);
1276                 qdisc_tree_decrease_qlen(cl->un.leaf.q, qlen);
1277         }
1278
1279         /* delete from hash and active; remainder in destroy_class */
1280         qdisc_class_hash_remove(&q->clhash, &cl->common);
1281         list_del(&cl->sibling);
1282
1283         if (cl->prio_activity)
1284                 htb_deactivate(q, cl);
1285
1286         if (cl->cmode != HTB_CAN_SEND)
1287                 htb_safe_rb_erase(&cl->pq_node, q->wait_pq + cl->level);
1288
1289         if (last_child)
1290                 htb_parent_to_leaf(q, cl, new_q);
1291
1292         if (--cl->refcnt == 0)
1293                 htb_destroy_class(sch, cl);
1294
1295         sch_tree_unlock(sch);
1296         return 0;
1297 }
1298
1299 static void htb_put(struct Qdisc *sch, unsigned long arg)
1300 {
1301         struct htb_class *cl = (struct htb_class *)arg;
1302
1303         if (--cl->refcnt == 0)
1304                 htb_destroy_class(sch, cl);
1305 }
1306
1307 static int htb_change_class(struct Qdisc *sch, u32 classid,
1308                             u32 parentid, struct nlattr **tca,
1309                             unsigned long *arg)
1310 {
1311         int err = -EINVAL;
1312         struct htb_sched *q = qdisc_priv(sch);
1313         struct htb_class *cl = (struct htb_class *)*arg, *parent;
1314         struct nlattr *opt = tca[TCA_OPTIONS];
1315         struct qdisc_rate_table *rtab = NULL, *ctab = NULL;
1316         struct nlattr *tb[TCA_HTB_RTAB + 1];
1317         struct tc_htb_opt *hopt;
1318
1319         /* extract all subattrs from opt attr */
1320         if (!opt)
1321                 goto failure;
1322
1323         err = nla_parse_nested(tb, TCA_HTB_RTAB, opt, htb_policy);
1324         if (err < 0)
1325                 goto failure;
1326
1327         err = -EINVAL;
1328         if (tb[TCA_HTB_PARMS] == NULL)
1329                 goto failure;
1330
1331         parent = parentid == TC_H_ROOT ? NULL : htb_find(parentid, sch);
1332
1333         hopt = nla_data(tb[TCA_HTB_PARMS]);
1334
1335         rtab = qdisc_get_rtab(&hopt->rate, tb[TCA_HTB_RTAB]);
1336         ctab = qdisc_get_rtab(&hopt->ceil, tb[TCA_HTB_CTAB]);
1337         if (!rtab || !ctab)
1338                 goto failure;
1339
1340         if (!cl) {              /* new class */
1341                 struct Qdisc *new_q;
1342                 int prio;
1343                 struct {
1344                         struct nlattr           nla;
1345                         struct gnet_estimator   opt;
1346                 } est = {
1347                         .nla = {
1348                                 .nla_len        = nla_attr_size(sizeof(est.opt)),
1349                                 .nla_type       = TCA_RATE,
1350                         },
1351                         .opt = {
1352                                 /* 4s interval, 16s averaging constant */
1353                                 .interval       = 2,
1354                                 .ewma_log       = 2,
1355                         },
1356                 };
1357
1358                 /* check for valid classid */
1359                 if (!classid || TC_H_MAJ(classid ^ sch->handle)
1360                     || htb_find(classid, sch))
1361                         goto failure;
1362
1363                 /* check maximal depth */
1364                 if (parent && parent->parent && parent->parent->level < 2) {
1365                         printk(KERN_ERR "htb: tree is too deep\n");
1366                         goto failure;
1367                 }
1368                 err = -ENOBUFS;
1369                 if ((cl = kzalloc(sizeof(*cl), GFP_KERNEL)) == NULL)
1370                         goto failure;
1371
1372                 gen_new_estimator(&cl->bstats, &cl->rate_est,
1373                                   &sch->dev->queue_lock,
1374                                   tca[TCA_RATE] ? : &est.nla);
1375                 cl->refcnt = 1;
1376                 INIT_LIST_HEAD(&cl->sibling);
1377                 INIT_LIST_HEAD(&cl->children);
1378                 INIT_LIST_HEAD(&cl->un.leaf.drop_list);
1379                 RB_CLEAR_NODE(&cl->pq_node);
1380
1381                 for (prio = 0; prio < TC_HTB_NUMPRIO; prio++)
1382                         RB_CLEAR_NODE(&cl->node[prio]);
1383
1384                 /* create leaf qdisc early because it uses kmalloc(GFP_KERNEL)
1385                    so that can't be used inside of sch_tree_lock
1386                    -- thanks to Karlis Peisenieks */
1387                 new_q = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops, classid);
1388                 sch_tree_lock(sch);
1389                 if (parent && !parent->level) {
1390                         unsigned int qlen = parent->un.leaf.q->q.qlen;
1391
1392                         /* turn parent into inner node */
1393                         qdisc_reset(parent->un.leaf.q);
1394                         qdisc_tree_decrease_qlen(parent->un.leaf.q, qlen);
1395                         qdisc_destroy(parent->un.leaf.q);
1396                         if (parent->prio_activity)
1397                                 htb_deactivate(q, parent);
1398
1399                         /* remove from evt list because of level change */
1400                         if (parent->cmode != HTB_CAN_SEND) {
1401                                 htb_safe_rb_erase(&parent->pq_node, q->wait_pq);
1402                                 parent->cmode = HTB_CAN_SEND;
1403                         }
1404                         parent->level = (parent->parent ? parent->parent->level
1405                                          : TC_HTB_MAXDEPTH) - 1;
1406                         memset(&parent->un.inner, 0, sizeof(parent->un.inner));
1407                 }
1408                 /* leaf (we) needs elementary qdisc */
1409                 cl->un.leaf.q = new_q ? new_q : &noop_qdisc;
1410
1411                 cl->common.classid = classid;
1412                 cl->parent = parent;
1413
1414                 /* set class to be in HTB_CAN_SEND state */
1415                 cl->tokens = hopt->buffer;
1416                 cl->ctokens = hopt->cbuffer;
1417                 cl->mbuffer = 60 * PSCHED_TICKS_PER_SEC;        /* 1min */
1418                 cl->t_c = psched_get_time();
1419                 cl->cmode = HTB_CAN_SEND;
1420
1421                 /* attach to the hash list and parent's family */
1422                 qdisc_class_hash_insert(&q->clhash, &cl->common);
1423                 list_add_tail(&cl->sibling,
1424                               parent ? &parent->children : &q->root);
1425         } else {
1426                 if (tca[TCA_RATE])
1427                         gen_replace_estimator(&cl->bstats, &cl->rate_est,
1428                                               &sch->dev->queue_lock,
1429                                               tca[TCA_RATE]);
1430                 sch_tree_lock(sch);
1431         }
1432
1433         /* it used to be a nasty bug here, we have to check that node
1434            is really leaf before changing cl->un.leaf ! */
1435         if (!cl->level) {
1436                 cl->un.leaf.quantum = rtab->rate.rate / q->rate2quantum;
1437                 if (!hopt->quantum && cl->un.leaf.quantum < 1000) {
1438                         printk(KERN_WARNING
1439                                "HTB: quantum of class %X is small. Consider r2q change.\n",
1440                                cl->common.classid);
1441                         cl->un.leaf.quantum = 1000;
1442                 }
1443                 if (!hopt->quantum && cl->un.leaf.quantum > 200000) {
1444                         printk(KERN_WARNING
1445                                "HTB: quantum of class %X is big. Consider r2q change.\n",
1446                                cl->common.classid);
1447                         cl->un.leaf.quantum = 200000;
1448                 }
1449                 if (hopt->quantum)
1450                         cl->un.leaf.quantum = hopt->quantum;
1451                 if ((cl->un.leaf.prio = hopt->prio) >= TC_HTB_NUMPRIO)
1452                         cl->un.leaf.prio = TC_HTB_NUMPRIO - 1;
1453
1454                 /* backup for htb_parent_to_leaf */
1455                 cl->quantum = cl->un.leaf.quantum;
1456                 cl->prio = cl->un.leaf.prio;
1457         }
1458
1459         cl->buffer = hopt->buffer;
1460         cl->cbuffer = hopt->cbuffer;
1461         if (cl->rate)
1462                 qdisc_put_rtab(cl->rate);
1463         cl->rate = rtab;
1464         if (cl->ceil)
1465                 qdisc_put_rtab(cl->ceil);
1466         cl->ceil = ctab;
1467         sch_tree_unlock(sch);
1468
1469         qdisc_class_hash_grow(sch, &q->clhash);
1470
1471         *arg = (unsigned long)cl;
1472         return 0;
1473
1474 failure:
1475         if (rtab)
1476                 qdisc_put_rtab(rtab);
1477         if (ctab)
1478                 qdisc_put_rtab(ctab);
1479         return err;
1480 }
1481
1482 static struct tcf_proto **htb_find_tcf(struct Qdisc *sch, unsigned long arg)
1483 {
1484         struct htb_sched *q = qdisc_priv(sch);
1485         struct htb_class *cl = (struct htb_class *)arg;
1486         struct tcf_proto **fl = cl ? &cl->filter_list : &q->filter_list;
1487
1488         return fl;
1489 }
1490
1491 static unsigned long htb_bind_filter(struct Qdisc *sch, unsigned long parent,
1492                                      u32 classid)
1493 {
1494         struct htb_sched *q = qdisc_priv(sch);
1495         struct htb_class *cl = htb_find(classid, sch);
1496
1497         /*if (cl && !cl->level) return 0;
1498            The line above used to be there to prevent attaching filters to
1499            leaves. But at least tc_index filter uses this just to get class
1500            for other reasons so that we have to allow for it.
1501            ----
1502            19.6.2002 As Werner explained it is ok - bind filter is just
1503            another way to "lock" the class - unlike "get" this lock can
1504            be broken by class during destroy IIUC.
1505          */
1506         if (cl)
1507                 cl->filter_cnt++;
1508         else
1509                 q->filter_cnt++;
1510         return (unsigned long)cl;
1511 }
1512
1513 static void htb_unbind_filter(struct Qdisc *sch, unsigned long arg)
1514 {
1515         struct htb_sched *q = qdisc_priv(sch);
1516         struct htb_class *cl = (struct htb_class *)arg;
1517
1518         if (cl)
1519                 cl->filter_cnt--;
1520         else
1521                 q->filter_cnt--;
1522 }
1523
1524 static void htb_walk(struct Qdisc *sch, struct qdisc_walker *arg)
1525 {
1526         struct htb_sched *q = qdisc_priv(sch);
1527         struct htb_class *cl;
1528         struct hlist_node *n;
1529         unsigned int i;
1530
1531         if (arg->stop)
1532                 return;
1533
1534         for (i = 0; i < q->clhash.hashsize; i++) {
1535                 hlist_for_each_entry(cl, n, &q->clhash.hash[i], common.hnode) {
1536                         if (arg->count < arg->skip) {
1537                                 arg->count++;
1538                                 continue;
1539                         }
1540                         if (arg->fn(sch, (unsigned long)cl, arg) < 0) {
1541                                 arg->stop = 1;
1542                                 return;
1543                         }
1544                         arg->count++;
1545                 }
1546         }
1547 }
1548
1549 static const struct Qdisc_class_ops htb_class_ops = {
1550         .graft          =       htb_graft,
1551         .leaf           =       htb_leaf,
1552         .qlen_notify    =       htb_qlen_notify,
1553         .get            =       htb_get,
1554         .put            =       htb_put,
1555         .change         =       htb_change_class,
1556         .delete         =       htb_delete,
1557         .walk           =       htb_walk,
1558         .tcf_chain      =       htb_find_tcf,
1559         .bind_tcf       =       htb_bind_filter,
1560         .unbind_tcf     =       htb_unbind_filter,
1561         .dump           =       htb_dump_class,
1562         .dump_stats     =       htb_dump_class_stats,
1563 };
1564
1565 static struct Qdisc_ops htb_qdisc_ops __read_mostly = {
1566         .next           =       NULL,
1567         .cl_ops         =       &htb_class_ops,
1568         .id             =       "htb",
1569         .priv_size      =       sizeof(struct htb_sched),
1570         .enqueue        =       htb_enqueue,
1571         .dequeue        =       htb_dequeue,
1572         .requeue        =       htb_requeue,
1573         .drop           =       htb_drop,
1574         .init           =       htb_init,
1575         .reset          =       htb_reset,
1576         .destroy        =       htb_destroy,
1577         .change         =       NULL /* htb_change */,
1578         .dump           =       htb_dump,
1579         .owner          =       THIS_MODULE,
1580 };
1581
1582 static int __init htb_module_init(void)
1583 {
1584         return register_qdisc(&htb_qdisc_ops);
1585 }
1586 static void __exit htb_module_exit(void)
1587 {
1588         unregister_qdisc(&htb_qdisc_ops);
1589 }
1590
1591 module_init(htb_module_init)
1592 module_exit(htb_module_exit)
1593 MODULE_LICENSE("GPL");