aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/fib_trie.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 1010b469d7d3..13a80aa911d8 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -164,7 +164,6 @@ static struct tnode *halve(struct trie *t, struct tnode *tn);
164static void tnode_free(struct tnode *tn); 164static void tnode_free(struct tnode *tn);
165 165
166static struct kmem_cache *fn_alias_kmem __read_mostly; 166static struct kmem_cache *fn_alias_kmem __read_mostly;
167static struct trie *trie_local = NULL, *trie_main = NULL;
168 167
169static inline struct tnode *node_parent(struct node *node) 168static inline struct tnode *node_parent(struct node *node)
170{ 169{
@@ -2003,11 +2002,6 @@ struct fib_table * __init fib_hash_init(u32 id)
2003 trie_init(t); 2002 trie_init(t);
2004 2003
2005 if (id == RT_TABLE_LOCAL) 2004 if (id == RT_TABLE_LOCAL)
2006 trie_local = t;
2007 else if (id == RT_TABLE_MAIN)
2008 trie_main = t;
2009
2010 if (id == RT_TABLE_LOCAL)
2011 printk(KERN_INFO "IPv4 FIB: Using LC-trie version %s\n", VERSION); 2005 printk(KERN_INFO "IPv4 FIB: Using LC-trie version %s\n", VERSION);
2012 2006
2013 return tb; 2007 return tb;
@@ -2016,6 +2010,7 @@ struct fib_table * __init fib_hash_init(u32 id)
2016#ifdef CONFIG_PROC_FS 2010#ifdef CONFIG_PROC_FS
2017/* Depth first Trie walk iterator */ 2011/* Depth first Trie walk iterator */
2018struct fib_trie_iter { 2012struct fib_trie_iter {
2013 struct trie *trie_local, *trie_main;
2019 struct tnode *tnode; 2014 struct tnode *tnode;
2020 struct trie *trie; 2015 struct trie *trie;
2021 unsigned index; 2016 unsigned index;
@@ -2182,7 +2177,20 @@ static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
2182 2177
2183static int fib_triestat_seq_show(struct seq_file *seq, void *v) 2178static int fib_triestat_seq_show(struct seq_file *seq, void *v)
2184{ 2179{
2180 struct trie *trie_local, *trie_main;
2185 struct trie_stat *stat; 2181 struct trie_stat *stat;
2182 struct fib_table *tb;
2183
2184 trie_local = NULL;
2185 tb = fib_get_table(RT_TABLE_LOCAL);
2186 if (tb)
2187 trie_local = (struct trie *) tb->tb_data;
2188
2189 trie_main = NULL;
2190 tb = fib_get_table(RT_TABLE_MAIN);
2191 if (tb)
2192 trie_main = (struct trie *) tb->tb_data;
2193
2186 2194
2187 stat = kmalloc(sizeof(*stat), GFP_KERNEL); 2195 stat = kmalloc(sizeof(*stat), GFP_KERNEL);
2188 if (!stat) 2196 if (!stat)
@@ -2226,13 +2234,13 @@ static struct node *fib_trie_get_idx(struct fib_trie_iter *iter,
2226 loff_t idx = 0; 2234 loff_t idx = 0;
2227 struct node *n; 2235 struct node *n;
2228 2236
2229 for (n = fib_trie_get_first(iter, trie_local); 2237 for (n = fib_trie_get_first(iter, iter->trie_local);
2230 n; ++idx, n = fib_trie_get_next(iter)) { 2238 n; ++idx, n = fib_trie_get_next(iter)) {
2231 if (pos == idx) 2239 if (pos == idx)
2232 return n; 2240 return n;
2233 } 2241 }
2234 2242
2235 for (n = fib_trie_get_first(iter, trie_main); 2243 for (n = fib_trie_get_first(iter, iter->trie_main);
2236 n; ++idx, n = fib_trie_get_next(iter)) { 2244 n; ++idx, n = fib_trie_get_next(iter)) {
2237 if (pos == idx) 2245 if (pos == idx)
2238 return n; 2246 return n;
@@ -2242,10 +2250,23 @@ static struct node *fib_trie_get_idx(struct fib_trie_iter *iter,
2242 2250
2243static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos) 2251static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
2244{ 2252{
2253 struct fib_trie_iter *iter = seq->private;
2254 struct fib_table *tb;
2255
2256 if (!iter->trie_local) {
2257 tb = fib_get_table(RT_TABLE_LOCAL);
2258 if (tb)
2259 iter->trie_local = (struct trie *) tb->tb_data;
2260 }
2261 if (!iter->trie_main) {
2262 tb = fib_get_table(RT_TABLE_MAIN);
2263 if (tb)
2264 iter->trie_main = (struct trie *) tb->tb_data;
2265 }
2245 rcu_read_lock(); 2266 rcu_read_lock();
2246 if (*pos == 0) 2267 if (*pos == 0)
2247 return SEQ_START_TOKEN; 2268 return SEQ_START_TOKEN;
2248 return fib_trie_get_idx(seq->private, *pos - 1); 2269 return fib_trie_get_idx(iter, *pos - 1);
2249} 2270}
2250 2271
2251static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos) 2272static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
@@ -2263,8 +2284,8 @@ static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2263 return v; 2284 return v;
2264 2285
2265 /* continue scan in next trie */ 2286 /* continue scan in next trie */
2266 if (iter->trie == trie_local) 2287 if (iter->trie == iter->trie_local)
2267 return fib_trie_get_first(iter, trie_main); 2288 return fib_trie_get_first(iter, iter->trie_main);
2268 2289
2269 return NULL; 2290 return NULL;
2270} 2291}
@@ -2330,7 +2351,7 @@ static int fib_trie_seq_show(struct seq_file *seq, void *v)
2330 return 0; 2351 return 0;
2331 2352
2332 if (!node_parent(n)) { 2353 if (!node_parent(n)) {
2333 if (iter->trie == trie_local) 2354 if (iter->trie == iter->trie_local)
2334 seq_puts(seq, "<local>:\n"); 2355 seq_puts(seq, "<local>:\n");
2335 else 2356 else
2336 seq_puts(seq, "<main>:\n"); 2357 seq_puts(seq, "<main>:\n");
@@ -2429,7 +2450,7 @@ static int fib_route_seq_show(struct seq_file *seq, void *v)
2429 return 0; 2450 return 0;
2430 } 2451 }
2431 2452
2432 if (iter->trie == trie_local) 2453 if (iter->trie == iter->trie_local)
2433 return 0; 2454 return 0;
2434 if (IS_TNODE(l)) 2455 if (IS_TNODE(l))
2435 return 0; 2456 return 0;