]> err.no Git - linux-2.6/blobdiff - net/ipv4/fib_trie.c
[IPV4] fib_trie: Fix sparse warnings.
[linux-2.6] / net / ipv4 / fib_trie.c
index f5c046b517e4f6db9a294c4a48b59fb949658653..3e94a4dddb0c69b76f4c85aadbc668eaaf4b0b54 100644 (file)
@@ -82,7 +82,6 @@
 #include <net/ip_fib.h>
 #include "fib_lookup.h"
 
-#undef CONFIG_IP_FIB_TRIE_STATS
 #define MAX_STAT_DEPTH 32
 
 #define KEYLENGTH (8*sizeof(t_key))
@@ -654,7 +653,6 @@ static struct node *resize(struct trie *t, struct tnode *tn)
 
 static struct tnode *inflate(struct trie *t, struct tnode *tn)
 {
-       struct tnode *inode;
        struct tnode *oldtnode = tn;
        int olen = tnode_child_length(tn);
        int i;
@@ -702,6 +700,7 @@ static struct tnode *inflate(struct trie *t, struct tnode *tn)
        }
 
        for (i = 0; i < olen; i++) {
+               struct tnode *inode;
                struct node *node = tnode_get_child(oldtnode, i);
                struct tnode *left, *right;
                int size, j;
@@ -980,8 +979,7 @@ static struct node *trie_rebalance(struct trie *t, struct tnode *tn)
 
 /* only used from updater-side */
 
-static  struct list_head *
-fib_insert_node(struct trie *t, int *err, u32 key, int plen)
+static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
 {
        int pos, newpos;
        struct tnode *tp = NULL, *tn = NULL;
@@ -1039,14 +1037,11 @@ fib_insert_node(struct trie *t, int *err, u32 key, int plen)
        /* Case 1: n is a leaf. Compare prefixes */
 
        if (n != NULL && IS_LEAF(n) && tkey_equals(key, n->key)) {
-               struct leaf *l = (struct leaf *) n;
-
+               l = (struct leaf *) n;
                li = leaf_info_new(plen);
 
-               if (!li) {
-                       *err = -ENOMEM;
-                       goto done;
-               }
+               if (!li)
+                       return NULL;
 
                fa_head = &li->falh;
                insert_leaf_info(&l->list, li);
@@ -1055,18 +1050,15 @@ fib_insert_node(struct trie *t, int *err, u32 key, int plen)
        t->size++;
        l = leaf_new();
 
-       if (!l) {
-               *err = -ENOMEM;
-               goto done;
-       }
+       if (!l)
+               return NULL;
 
        l->key = key;
        li = leaf_info_new(plen);
 
        if (!li) {
                tnode_free((struct tnode *) l);
-               *err = -ENOMEM;
-               goto done;
+               return NULL;
        }
 
        fa_head = &li->falh;
@@ -1102,8 +1094,7 @@ fib_insert_node(struct trie *t, int *err, u32 key, int plen)
                if (!tn) {
                        free_leaf_info(li);
                        tnode_free((struct tnode *) l);
-                       *err = -ENOMEM;
-                       goto done;
+                       return NULL;
                }
 
                node_set_parent((struct node *)tn, tp);
@@ -1262,10 +1253,11 @@ static int fn_trie_insert(struct fib_table *tb, struct fib_config *cfg)
         */
 
        if (!fa_head) {
-               err = 0;
-               fa_head = fib_insert_node(t, &err, key, plen);
-               if (err)
+               fa_head = fib_insert_node(t, key, plen);
+               if (unlikely(!fa_head)) {
+                       err = -ENOMEM;
                        goto out_free_new_fa;
+               }
        }
 
        list_add_tail_rcu(&new_fa->fa_list,
@@ -2125,20 +2117,22 @@ static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
        bytes += sizeof(struct node *) * pointers;
        seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers);
        seq_printf(seq, "Total size: %u  kB\n", (bytes + 1023) / 1024);
+}
 
 #ifdef CONFIG_IP_FIB_TRIE_STATS
-       seq_printf(seq, "Counters:\n---------\n");
-       seq_printf(seq,"gets = %d\n", t->stats.gets);
-       seq_printf(seq,"backtracks = %d\n", t->stats.backtrack);
-       seq_printf(seq,"semantic match passed = %d\n", t->stats.semantic_match_passed);
-       seq_printf(seq,"semantic match miss = %d\n", t->stats.semantic_match_miss);
-       seq_printf(seq,"null node hit= %d\n", t->stats.null_node_hit);
-       seq_printf(seq,"skipped node resize = %d\n", t->stats.resize_node_skipped);
-#ifdef CLEAR_STATS
-       memset(&(t->stats), 0, sizeof(t->stats));
-#endif
-#endif /*  CONFIG_IP_FIB_TRIE_STATS */
+static void trie_show_usage(struct seq_file *seq,
+                           const struct trie_use_stats *stats)
+{
+       seq_printf(seq, "\nCounters:\n---------\n");
+       seq_printf(seq,"gets = %u\n", stats->gets);
+       seq_printf(seq,"backtracks = %u\n", stats->backtrack);
+       seq_printf(seq,"semantic match passed = %u\n", stats->semantic_match_passed);
+       seq_printf(seq,"semantic match miss = %u\n", stats->semantic_match_miss);
+       seq_printf(seq,"null node hit= %u\n", stats->null_node_hit);
+       seq_printf(seq,"skipped node resize = %u\n\n", stats->resize_node_skipped);
 }
+#endif /*  CONFIG_IP_FIB_TRIE_STATS */
+
 
 static int fib_triestat_seq_show(struct seq_file *seq, void *v)
 {
@@ -2169,12 +2163,18 @@ static int fib_triestat_seq_show(struct seq_file *seq, void *v)
                seq_printf(seq, "Local:\n");
                trie_collect_stats(trie_local, stat);
                trie_show_stats(seq, stat);
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+               trie_show_usage(seq, &trie_local->stats);
+#endif
        }
 
        if (trie_main) {
                seq_printf(seq, "Main:\n");
                trie_collect_stats(trie_main, stat);
                trie_show_stats(seq, stat);
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+               trie_show_usage(seq, &trie_main->stats);
+#endif
        }
        kfree(stat);
 
@@ -2233,6 +2233,7 @@ static struct node *fib_trie_get_idx(struct fib_trie_iter *iter,
 }
 
 static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
+       __acquires(RCU)
 {
        struct fib_trie_iter *iter = seq->private;
        struct fib_table *tb;
@@ -2275,6 +2276,7 @@ static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 }
 
 static void fib_trie_seq_stop(struct seq_file *seq, void *v)
+       __releases(RCU)
 {
        rcu_read_unlock();
 }