diff options
Diffstat (limited to 'net/ipv4/fib_trie.c')
-rw-r--r-- | net/ipv4/fib_trie.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index e320b32373e5..ccd3efc6a173 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -50,7 +50,7 @@ | |||
50 | * Patrick McHardy <kaber@trash.net> | 50 | * Patrick McHardy <kaber@trash.net> |
51 | */ | 51 | */ |
52 | 52 | ||
53 | #define VERSION "0.404" | 53 | #define VERSION "0.406" |
54 | 54 | ||
55 | #include <linux/config.h> | 55 | #include <linux/config.h> |
56 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
@@ -84,7 +84,7 @@ | |||
84 | #include "fib_lookup.h" | 84 | #include "fib_lookup.h" |
85 | 85 | ||
86 | #undef CONFIG_IP_FIB_TRIE_STATS | 86 | #undef CONFIG_IP_FIB_TRIE_STATS |
87 | #define MAX_CHILDS 16384 | 87 | #define MAX_STAT_DEPTH 32 |
88 | 88 | ||
89 | #define KEYLENGTH (8*sizeof(t_key)) | 89 | #define KEYLENGTH (8*sizeof(t_key)) |
90 | #define MASK_PFX(k, l) (((l)==0)?0:(k >> (KEYLENGTH-l)) << (KEYLENGTH-l)) | 90 | #define MASK_PFX(k, l) (((l)==0)?0:(k >> (KEYLENGTH-l)) << (KEYLENGTH-l)) |
@@ -154,7 +154,7 @@ struct trie_stat { | |||
154 | unsigned int tnodes; | 154 | unsigned int tnodes; |
155 | unsigned int leaves; | 155 | unsigned int leaves; |
156 | unsigned int nullpointers; | 156 | unsigned int nullpointers; |
157 | unsigned int nodesizes[MAX_CHILDS]; | 157 | unsigned int nodesizes[MAX_STAT_DEPTH]; |
158 | }; | 158 | }; |
159 | 159 | ||
160 | struct trie { | 160 | struct trie { |
@@ -2040,7 +2040,15 @@ rescan: | |||
2040 | static struct node *fib_trie_get_first(struct fib_trie_iter *iter, | 2040 | static struct node *fib_trie_get_first(struct fib_trie_iter *iter, |
2041 | struct trie *t) | 2041 | struct trie *t) |
2042 | { | 2042 | { |
2043 | struct node *n = rcu_dereference(t->trie); | 2043 | struct node *n ; |
2044 | |||
2045 | if(!t) | ||
2046 | return NULL; | ||
2047 | |||
2048 | n = rcu_dereference(t->trie); | ||
2049 | |||
2050 | if(!iter) | ||
2051 | return NULL; | ||
2044 | 2052 | ||
2045 | if (n && IS_TNODE(n)) { | 2053 | if (n && IS_TNODE(n)) { |
2046 | iter->tnode = (struct tnode *) n; | 2054 | iter->tnode = (struct tnode *) n; |
@@ -2072,7 +2080,9 @@ static void trie_collect_stats(struct trie *t, struct trie_stat *s) | |||
2072 | int i; | 2080 | int i; |
2073 | 2081 | ||
2074 | s->tnodes++; | 2082 | s->tnodes++; |
2075 | s->nodesizes[tn->bits]++; | 2083 | if(tn->bits < MAX_STAT_DEPTH) |
2084 | s->nodesizes[tn->bits]++; | ||
2085 | |||
2076 | for (i = 0; i < (1<<tn->bits); i++) | 2086 | for (i = 0; i < (1<<tn->bits); i++) |
2077 | if (!tn->child[i]) | 2087 | if (!tn->child[i]) |
2078 | s->nullpointers++; | 2088 | s->nullpointers++; |
@@ -2102,8 +2112,8 @@ static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat) | |||
2102 | seq_printf(seq, "\tInternal nodes: %d\n\t", stat->tnodes); | 2112 | seq_printf(seq, "\tInternal nodes: %d\n\t", stat->tnodes); |
2103 | bytes += sizeof(struct tnode) * stat->tnodes; | 2113 | bytes += sizeof(struct tnode) * stat->tnodes; |
2104 | 2114 | ||
2105 | max = MAX_CHILDS-1; | 2115 | max = MAX_STAT_DEPTH; |
2106 | while (max >= 0 && stat->nodesizes[max] == 0) | 2116 | while (max > 0 && stat->nodesizes[max-1] == 0) |
2107 | max--; | 2117 | max--; |
2108 | 2118 | ||
2109 | pointers = 0; | 2119 | pointers = 0; |