pkt_sched: Annotate uninitialized var in sfq_enqueue()
[safe/jmp/linux-2.6] / net / sched / sch_htb.c
index 80cb94d..5070643 100644 (file)
@@ -125,13 +125,6 @@ struct htb_class {
        psched_time_t t_c;      /* checkpoint time */
 };
 
-static inline long L2T(struct htb_class *cl, struct qdisc_rate_table *rate,
-                          int size)
-{
-       long result = qdisc_l2t(rate, size);
-       return result;
-}
-
 struct htb_sched {
        struct Qdisc_class_hash clhash;
        struct list_head drops[TC_HTB_NUMPRIO];/* active leaves (for drops) */
@@ -584,6 +577,32 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch)
        return NET_XMIT_SUCCESS;
 }
 
+static inline void htb_accnt_tokens(struct htb_class *cl, int bytes, long diff)
+{
+       long toks = diff + cl->tokens;
+
+       if (toks > cl->buffer)
+               toks = cl->buffer;
+       toks -= (long) qdisc_l2t(cl->rate, bytes);
+       if (toks <= -cl->mbuffer)
+               toks = 1 - cl->mbuffer;
+
+       cl->tokens = toks;
+}
+
+static inline void htb_accnt_ctokens(struct htb_class *cl, int bytes, long diff)
+{
+       long toks = diff + cl->ctokens;
+
+       if (toks > cl->cbuffer)
+               toks = cl->cbuffer;
+       toks -= (long) qdisc_l2t(cl->ceil, bytes);
+       if (toks <= -cl->mbuffer)
+               toks = 1 - cl->mbuffer;
+
+       cl->ctokens = toks;
+}
+
 /**
  * htb_charge_class - charges amount "bytes" to leaf and ancestors
  *
@@ -599,26 +618,20 @@ static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,
                             int level, struct sk_buff *skb)
 {
        int bytes = qdisc_pkt_len(skb);
-       long toks, diff;
        enum htb_cmode old_mode;
-
-#define HTB_ACCNT(T,B,R) toks = diff + cl->T; \
-       if (toks > cl->B) toks = cl->B; \
-       toks -= L2T(cl, cl->R, bytes); \
-       if (toks <= -cl->mbuffer) toks = 1-cl->mbuffer; \
-       cl->T = toks
+       long diff;
 
        while (cl) {
                diff = psched_tdiff_bounded(q->now, cl->t_c, cl->mbuffer);
                if (cl->level >= level) {
                        if (cl->level == level)
                                cl->xstats.lends++;
-                       HTB_ACCNT(tokens, buffer, rate);
+                       htb_accnt_tokens(cl, bytes, diff);
                } else {
                        cl->xstats.borrows++;
                        cl->tokens += diff;     /* we moved t_c; update tokens */
                }
-               HTB_ACCNT(ctokens, cbuffer, ceil);
+               htb_accnt_ctokens(cl, bytes, diff);
                cl->t_c = q->now;
 
                old_mode = cl->cmode;
@@ -685,14 +698,14 @@ static struct rb_node *htb_id_find_next_upper(int prio, struct rb_node *n,
        while (n) {
                struct htb_class *cl =
                    rb_entry(n, struct htb_class, node[prio]);
-               if (id == cl->common.classid)
-                       return n;
 
                if (id > cl->common.classid) {
                        n = n->rb_right;
-               } else {
+               } else if (id < cl->common.classid) {
                        r = n;
                        n = n->rb_left;
+               } else {
+                       return n;
                }
        }
        return r;
@@ -713,7 +726,7 @@ static struct htb_class *htb_lookup_leaf(struct rb_root *tree, int prio,
                u32 *pid;
        } stk[TC_HTB_MAXDEPTH], *sp = stk;
 
-       WARN_ON(!tree->rb_node);
+       BUG_ON(!tree->rb_node);
        sp->root = tree->rb_node;
        sp->pptr = pptr;
        sp->pid = pid;
@@ -733,9 +746,10 @@ static struct htb_class *htb_lookup_leaf(struct rb_root *tree, int prio,
                                *sp->pptr = (*sp->pptr)->rb_left;
                        if (sp > stk) {
                                sp--;
-                               WARN_ON(!*sp->pptr);
-                               if (!*sp->pptr)
+                               if (!*sp->pptr) {
+                                       WARN_ON(1);
                                        return NULL;
+                               }
                                htb_next_rb_node(sp->pptr);
                        }
                } else {
@@ -766,8 +780,7 @@ static struct sk_buff *htb_dequeue_tree(struct htb_sched *q, int prio,
 
        do {
 next:
-               WARN_ON(!cl);
-               if (!cl)
+               if (unlikely(!cl))
                        return NULL;
 
                /* class can be empty - it is unlikely but can be true if leaf