The code to dump can use the existing hash chain rather than doing repeated lookup. Signed-off-by: Stephen Hemminger --- a/net/ipv4/fib_trie.c 2008-01-15 09:48:10.000000000 -0800 +++ b/net/ipv4/fib_trie.c 2008-01-15 09:48:21.000000000 -0800 @@ -879,11 +879,10 @@ nomem: static struct leaf_info *find_leaf_info(struct leaf *l, int plen) { - struct hlist_head *head = &l->list; struct hlist_node *node; struct leaf_info *li; - hlist_for_each_entry_rcu(li, node, head, hlist) + hlist_for_each_entry_rcu(li, node, &l->list, hlist) if (li->plen == plen) return li; @@ -1282,10 +1281,9 @@ static int check_leaf(struct trie *t, st struct fib_result *res) { struct leaf_info *li; - struct hlist_head *hhead = &l->list; struct hlist_node *node; - hlist_for_each_entry_rcu(li, node, hhead, hlist) { + hlist_for_each_entry_rcu(li, node, &l->list, hlist) { int err; int plen = li->plen; __be32 mask = inet_make_mask(plen); @@ -2340,31 +2338,30 @@ static int fib_trie_seq_show(struct seq_ } else { struct leaf *l = (struct leaf *) n; - int i; + struct leaf_info *li; + struct hlist_node *node; + __be32 val = htonl(l->key); seq_indent(seq, iter->depth); seq_printf(seq, " |-- %d.%d.%d.%d\n", NIPQUAD(val)); - for (i = 32; i >= 0; i--) { - struct leaf_info *li = find_leaf_info(l, i); - if (li) { - struct fib_alias *fa; + hlist_for_each_entry_rcu(li, node, &l->list, hlist) { + struct fib_alias *fa; - list_for_each_entry_rcu(fa, &li->falh, fa_list) { - char buf1[32], buf2[32]; + list_for_each_entry_rcu(fa, &li->falh, fa_list) { + char buf1[32], buf2[32]; - seq_indent(seq, iter->depth+1); - seq_printf(seq, " /%d %s %s", i, - rtn_scope(buf1, sizeof(buf1), - fa->fa_scope), - rtn_type(buf2, sizeof(buf2), - fa->fa_type)); - if (fa->fa_tos) - seq_printf(seq, "tos =%d\n", - fa->fa_tos); - seq_putc(seq, '\n'); - } + seq_indent(seq, iter->depth+1); + seq_printf(seq, " /%d %s %s", li->plen, + rtn_scope(buf1, sizeof(buf1), + fa->fa_scope), + rtn_type(buf2, sizeof(buf2), + fa->fa_type)); + if (fa->fa_tos) + seq_printf(seq, "tos =%d\n", + fa->fa_tos); + seq_putc(seq, '\n'); } } } @@ -2418,8 +2415,8 @@ static int fib_route_seq_show(struct seq { const struct fib_trie_iter *iter = seq->private; struct leaf *l = v; - int i; - char bf[128]; + struct leaf_info *li; + struct hlist_node *node; if (v == SEQ_START_TOKEN) { seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway " @@ -2430,23 +2427,21 @@ static int fib_route_seq_show(struct seq if (iter->trie == iter->trie_local) return 0; + if (IS_TNODE(l)) return 0; - for (i=32; i>=0; i--) { - struct leaf_info *li = find_leaf_info(l, i); + hlist_for_each_entry_rcu(li, node, &l->list, hlist) { struct fib_alias *fa; __be32 mask, prefix; - if (!li) - continue; - mask = inet_make_mask(li->plen); prefix = htonl(l->key); list_for_each_entry_rcu(fa, &li->falh, fa_list) { const struct fib_info *fi = fa->fa_info; unsigned flags = fib_flag_trans(fa->fa_type, mask, fi); + char bf[128]; if (fa->fa_type == RTN_BROADCAST || fa->fa_type == RTN_MULTICAST) -- Stephen Hemminger -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html