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