diff options
Diffstat (limited to 'net/sched/sch_htb.c')
-rw-r--r-- | net/sched/sch_htb.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 15f23c5511a8..1f098d862f92 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * Credits (in time order) for older HTB versions: | 11 | * Credits (in time order) for older HTB versions: |
12 | * Stef Coene <stef.coene@docum.org> | 12 | * Stef Coene <stef.coene@docum.org> |
13 | * HTB support at LARTC mailing list | 13 | * HTB support at LARTC mailing list |
14 | * Ondrej Kraus, <krauso@barr.cz> | 14 | * Ondrej Kraus, <krauso@barr.cz> |
15 | * found missing INIT_QDISC(htb) | 15 | * found missing INIT_QDISC(htb) |
16 | * Vladimir Smelhaus, Aamer Akhter, Bert Hubert | 16 | * Vladimir Smelhaus, Aamer Akhter, Bert Hubert |
17 | * helped a lot to locate nasty class stall bug | 17 | * helped a lot to locate nasty class stall bug |
@@ -59,11 +59,11 @@ | |||
59 | Author: devik@cdi.cz | 59 | Author: devik@cdi.cz |
60 | ======================================================================== | 60 | ======================================================================== |
61 | HTB is like TBF with multiple classes. It is also similar to CBQ because | 61 | HTB is like TBF with multiple classes. It is also similar to CBQ because |
62 | it allows to assign priority to each class in hierarchy. | 62 | it allows to assign priority to each class in hierarchy. |
63 | In fact it is another implementation of Floyd's formal sharing. | 63 | In fact it is another implementation of Floyd's formal sharing. |
64 | 64 | ||
65 | Levels: | 65 | Levels: |
66 | Each class is assigned level. Leaf has ALWAYS level 0 and root | 66 | Each class is assigned level. Leaf has ALWAYS level 0 and root |
67 | classes have level TC_HTB_MAXDEPTH-1. Interior nodes has level | 67 | classes have level TC_HTB_MAXDEPTH-1. Interior nodes has level |
68 | one less than their parent. | 68 | one less than their parent. |
69 | */ | 69 | */ |
@@ -245,7 +245,7 @@ static inline struct htb_class *htb_find(u32 handle, struct Qdisc *sch) | |||
245 | * We allow direct class selection by classid in priority. The we examine | 245 | * We allow direct class selection by classid in priority. The we examine |
246 | * filters in qdisc and in inner nodes (if higher filter points to the inner | 246 | * filters in qdisc and in inner nodes (if higher filter points to the inner |
247 | * node). If we end up with classid MAJOR:0 we enqueue the skb into special | 247 | * node). If we end up with classid MAJOR:0 we enqueue the skb into special |
248 | * internal fifo (direct). These packets then go directly thru. If we still | 248 | * internal fifo (direct). These packets then go directly thru. If we still |
249 | * have no valid leaf we try to use MAJOR:default leaf. It still unsuccessfull | 249 | * have no valid leaf we try to use MAJOR:default leaf. It still unsuccessfull |
250 | * then finish and return direct queue. | 250 | * then finish and return direct queue. |
251 | */ | 251 | */ |
@@ -433,7 +433,7 @@ static inline void htb_remove_class_from_row(struct htb_sched *q, | |||
433 | * htb_activate_prios - creates active classe's feed chain | 433 | * htb_activate_prios - creates active classe's feed chain |
434 | * | 434 | * |
435 | * The class is connected to ancestors and/or appropriate rows | 435 | * The class is connected to ancestors and/or appropriate rows |
436 | * for priorities it is participating on. cl->cmode must be new | 436 | * for priorities it is participating on. cl->cmode must be new |
437 | * (activated) mode. It does nothing if cl->prio_activity == 0. | 437 | * (activated) mode. It does nothing if cl->prio_activity == 0. |
438 | */ | 438 | */ |
439 | static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl) | 439 | static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl) |
@@ -466,7 +466,7 @@ static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl) | |||
466 | /** | 466 | /** |
467 | * htb_deactivate_prios - remove class from feed chain | 467 | * htb_deactivate_prios - remove class from feed chain |
468 | * | 468 | * |
469 | * cl->cmode must represent old mode (before deactivation). It does | 469 | * cl->cmode must represent old mode (before deactivation). It does |
470 | * nothing if cl->prio_activity == 0. Class is removed from all feed | 470 | * nothing if cl->prio_activity == 0. Class is removed from all feed |
471 | * chains and rows. | 471 | * chains and rows. |
472 | */ | 472 | */ |
@@ -524,9 +524,9 @@ static inline long htb_hiwater(const struct htb_class *cl) | |||
524 | * | 524 | * |
525 | * It computes cl's mode at time cl->t_c+diff and returns it. If mode | 525 | * It computes cl's mode at time cl->t_c+diff and returns it. If mode |
526 | * is not HTB_CAN_SEND then cl->pq_key is updated to time difference | 526 | * is not HTB_CAN_SEND then cl->pq_key is updated to time difference |
527 | * from now to time when cl will change its state. | 527 | * from now to time when cl will change its state. |
528 | * Also it is worth to note that class mode doesn't change simply | 528 | * Also it is worth to note that class mode doesn't change simply |
529 | * at cl->{c,}tokens == 0 but there can rather be hysteresis of | 529 | * at cl->{c,}tokens == 0 but there can rather be hysteresis of |
530 | * 0 .. -cl->{c,}buffer range. It is meant to limit number of | 530 | * 0 .. -cl->{c,}buffer range. It is meant to limit number of |
531 | * mode transitions per time unit. The speed gain is about 1/6. | 531 | * mode transitions per time unit. The speed gain is about 1/6. |
532 | */ | 532 | */ |
@@ -575,7 +575,7 @@ htb_change_class_mode(struct htb_sched *q, struct htb_class *cl, long *diff) | |||
575 | } | 575 | } |
576 | 576 | ||
577 | /** | 577 | /** |
578 | * htb_activate - inserts leaf cl into appropriate active feeds | 578 | * htb_activate - inserts leaf cl into appropriate active feeds |
579 | * | 579 | * |
580 | * Routine learns (new) priority of leaf and activates feed chain | 580 | * Routine learns (new) priority of leaf and activates feed chain |
581 | * for the prio. It can be called on already active leaf safely. | 581 | * for the prio. It can be called on already active leaf safely. |
@@ -594,7 +594,7 @@ static inline void htb_activate(struct htb_sched *q, struct htb_class *cl) | |||
594 | } | 594 | } |
595 | 595 | ||
596 | /** | 596 | /** |
597 | * htb_deactivate - remove leaf cl from active feeds | 597 | * htb_deactivate - remove leaf cl from active feeds |
598 | * | 598 | * |
599 | * Make sure that leaf is active. In the other words it can't be called | 599 | * Make sure that leaf is active. In the other words it can't be called |
600 | * with non-active leaf. It also removes class from the drop list. | 600 | * with non-active leaf. It also removes class from the drop list. |
@@ -854,7 +854,7 @@ static struct htb_class *htb_lookup_leaf(struct rb_root *tree, int prio, | |||
854 | 854 | ||
855 | for (i = 0; i < 65535; i++) { | 855 | for (i = 0; i < 65535; i++) { |
856 | if (!*sp->pptr && *sp->pid) { | 856 | if (!*sp->pptr && *sp->pid) { |
857 | /* ptr was invalidated but id is valid - try to recover | 857 | /* ptr was invalidated but id is valid - try to recover |
858 | the original or next ptr */ | 858 | the original or next ptr */ |
859 | *sp->pptr = | 859 | *sp->pptr = |
860 | htb_id_find_next_upper(prio, sp->root, *sp->pid); | 860 | htb_id_find_next_upper(prio, sp->root, *sp->pid); |
@@ -906,7 +906,7 @@ next: | |||
906 | 906 | ||
907 | /* class can be empty - it is unlikely but can be true if leaf | 907 | /* class can be empty - it is unlikely but can be true if leaf |
908 | qdisc drops packets in enqueue routine or if someone used | 908 | qdisc drops packets in enqueue routine or if someone used |
909 | graft operation on the leaf since last dequeue; | 909 | graft operation on the leaf since last dequeue; |
910 | simply deactivate and skip such class */ | 910 | simply deactivate and skip such class */ |
911 | if (unlikely(cl->un.leaf.q->q.qlen == 0)) { | 911 | if (unlikely(cl->un.leaf.q->q.qlen == 0)) { |
912 | struct htb_class *next; | 912 | struct htb_class *next; |
@@ -1229,7 +1229,7 @@ static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new, | |||
1229 | if (cl && !cl->level) { | 1229 | if (cl && !cl->level) { |
1230 | if (new == NULL && | 1230 | if (new == NULL && |
1231 | (new = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops, | 1231 | (new = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops, |
1232 | cl->classid)) | 1232 | cl->classid)) |
1233 | == NULL) | 1233 | == NULL) |
1234 | return -ENOBUFS; | 1234 | return -ENOBUFS; |
1235 | sch_tree_lock(sch); | 1235 | sch_tree_lock(sch); |
@@ -1347,7 +1347,7 @@ static void htb_destroy(struct Qdisc *sch) | |||
1347 | del_timer_sync(&q->rttim); | 1347 | del_timer_sync(&q->rttim); |
1348 | #endif | 1348 | #endif |
1349 | /* This line used to be after htb_destroy_class call below | 1349 | /* This line used to be after htb_destroy_class call below |
1350 | and surprisingly it worked in 2.4. But it must precede it | 1350 | and surprisingly it worked in 2.4. But it must precede it |
1351 | because filter need its target class alive to be able to call | 1351 | because filter need its target class alive to be able to call |
1352 | unbind_filter on it (without Oops). */ | 1352 | unbind_filter on it (without Oops). */ |
1353 | htb_destroy_filters(&q->filter_list); | 1353 | htb_destroy_filters(&q->filter_list); |