Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d717a9a62049a03e85c3c2dd3399416eeb34a8be
Commit:     d717a9a62049a03e85c3c2dd3399416eeb34a8be
Parent:     28d36e3702fcbed73c38e877bcf2a8f8946b7f3d
Author:     Stephen Hemminger <[EMAIL PROTECTED]>
AuthorDate: Mon Jan 14 23:11:54 2008 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 15:02:14 2008 -0800

    [IPV4] fib_trie: size and statistics
    
    Show number of entries in trie, the size field was being set but never used,
    but it only counted leaves, not all entries. Refactor the two cases in
    fib_triestat_seq_show into a single routine.
    
    Note: the stat structure was being malloc'd but the stack usage isn't so
    high (288 bytes) that it is worth the additional complexity.
    
    Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/ipv4/fib_trie.c |   55 ++++++++++++++++++--------------------------------
 1 files changed, 20 insertions(+), 35 deletions(-)

diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 72c78c2..a15cb0d 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -148,10 +148,10 @@ struct trie_stat {
 
 struct trie {
        struct node *trie;
+       unsigned int size;
 #ifdef CONFIG_IP_FIB_TRIE_STATS
        struct trie_use_stats stats;
 #endif
-       int size;
 };
 
 static void put_child(struct trie *t, struct tnode *tn, int i, struct node *n);
@@ -1045,7 +1045,6 @@ static struct list_head *fib_insert_node(struct trie *t, 
u32 key, int plen)
                insert_leaf_info(&l->list, li);
                goto done;
        }
-       t->size++;
        l = leaf_new();
 
        if (!l)
@@ -1261,6 +1260,8 @@ static int fn_trie_insert(struct fib_table *tb, struct 
fib_config *cfg)
        list_add_tail_rcu(&new_fa->fa_list,
                          (fa ? &fa->fa_list : fa_head));
 
+       t->size++;
+
        rt_cache_flush(-1);
        rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id,
                  &cfg->fc_nlinfo, 0);
@@ -2131,50 +2132,34 @@ static void trie_show_usage(struct seq_file *seq,
 }
 #endif /*  CONFIG_IP_FIB_TRIE_STATS */
 
+static void fib_trie_show(struct seq_file *seq, const char *name, struct trie 
*trie)
+{
+       struct trie_stat stat;
+
+       seq_printf(seq, "%s: %d\n", name, trie->size);
+       trie_collect_stats(trie, &stat);
+       trie_show_stats(seq, &stat);
+#ifdef CONFIG_IP_FIB_TRIE_STATS
+       trie_show_usage(seq, &trie->stats);
+#endif
+}
 
 static int fib_triestat_seq_show(struct seq_file *seq, void *v)
 {
        struct net *net = (struct net *)seq->private;
-       struct trie *trie_local, *trie_main;
-       struct trie_stat *stat;
        struct fib_table *tb;
 
-       trie_local = NULL;
+       seq_printf(seq,
+                  "Basic info: size of leaf: %Zd bytes, size of tnode: %Zd 
bytes.\n",
+                  sizeof(struct leaf), sizeof(struct tnode));
+
        tb = fib_get_table(net, RT_TABLE_LOCAL);
        if (tb)
-               trie_local = (struct trie *) tb->tb_data;
+               fib_trie_show(seq, "Local", (struct trie *) tb->tb_data);
 
-       trie_main = NULL;
        tb = fib_get_table(net, RT_TABLE_MAIN);
        if (tb)
-               trie_main = (struct trie *) tb->tb_data;
-
-
-       stat = kmalloc(sizeof(*stat), GFP_KERNEL);
-       if (!stat)
-               return -ENOMEM;
-
-       seq_printf(seq, "Basic info: size of leaf: %Zd bytes, size of tnode: 
%Zd bytes.\n",
-                  sizeof(struct leaf), sizeof(struct tnode));
-
-       if (trie_local) {
-               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);
+               fib_trie_show(seq, "Main", (struct trie *) tb->tb_data);
 
        return 0;
 }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to