diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-09-09 19:32:28 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-09-10 15:32:02 -0400 |
commit | a034ee3cca5726b14107f281f4bed1c0fd44472a (patch) | |
tree | 09e4ccf3da1377aea06771357b216a1b372c6687 /net/ipv4/fib_trie.c | |
parent | 4642610c77b345130d6b5a08c75d23ad98601fd5 (diff) |
fib: cleanups
Use rcu_dereference_rtnl() helper
Change hard coded constants in fib_flag_trans()
7 -> RTN_UNREACHABLE
8 -> RTN_PROHIBIT
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/fib_trie.c')
-rw-r--r-- | net/ipv4/fib_trie.c | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 4a8e370862bc..a96e5ec211a0 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -186,9 +186,7 @@ static inline struct tnode *node_parent_rcu(struct node *node) | |||
186 | { | 186 | { |
187 | struct tnode *ret = node_parent(node); | 187 | struct tnode *ret = node_parent(node); |
188 | 188 | ||
189 | return rcu_dereference_check(ret, | 189 | return rcu_dereference_rtnl(ret); |
190 | rcu_read_lock_held() || | ||
191 | lockdep_rtnl_is_held()); | ||
192 | } | 190 | } |
193 | 191 | ||
194 | /* Same as rcu_assign_pointer | 192 | /* Same as rcu_assign_pointer |
@@ -211,9 +209,7 @@ static inline struct node *tnode_get_child_rcu(struct tnode *tn, unsigned int i) | |||
211 | { | 209 | { |
212 | struct node *ret = tnode_get_child(tn, i); | 210 | struct node *ret = tnode_get_child(tn, i); |
213 | 211 | ||
214 | return rcu_dereference_check(ret, | 212 | return rcu_dereference_rtnl(ret); |
215 | rcu_read_lock_held() || | ||
216 | lockdep_rtnl_is_held()); | ||
217 | } | 213 | } |
218 | 214 | ||
219 | static inline int tnode_child_length(const struct tnode *tn) | 215 | static inline int tnode_child_length(const struct tnode *tn) |
@@ -459,8 +455,8 @@ static struct tnode *tnode_new(t_key key, int pos, int bits) | |||
459 | tn->empty_children = 1<<bits; | 455 | tn->empty_children = 1<<bits; |
460 | } | 456 | } |
461 | 457 | ||
462 | pr_debug("AT %p s=%u %lu\n", tn, (unsigned int) sizeof(struct tnode), | 458 | pr_debug("AT %p s=%zu %zu\n", tn, sizeof(struct tnode), |
463 | (unsigned long) (sizeof(struct node) << bits)); | 459 | sizeof(struct node) << bits); |
464 | return tn; | 460 | return tn; |
465 | } | 461 | } |
466 | 462 | ||
@@ -609,11 +605,10 @@ static struct node *resize(struct trie *t, struct tnode *tn) | |||
609 | 605 | ||
610 | /* Keep root node larger */ | 606 | /* Keep root node larger */ |
611 | 607 | ||
612 | if (!node_parent((struct node*) tn)) { | 608 | if (!node_parent((struct node *)tn)) { |
613 | inflate_threshold_use = inflate_threshold_root; | 609 | inflate_threshold_use = inflate_threshold_root; |
614 | halve_threshold_use = halve_threshold_root; | 610 | halve_threshold_use = halve_threshold_root; |
615 | } | 611 | } else { |
616 | else { | ||
617 | inflate_threshold_use = inflate_threshold; | 612 | inflate_threshold_use = inflate_threshold; |
618 | halve_threshold_use = halve_threshold; | 613 | halve_threshold_use = halve_threshold; |
619 | } | 614 | } |
@@ -639,7 +634,7 @@ static struct node *resize(struct trie *t, struct tnode *tn) | |||
639 | check_tnode(tn); | 634 | check_tnode(tn); |
640 | 635 | ||
641 | /* Return if at least one inflate is run */ | 636 | /* Return if at least one inflate is run */ |
642 | if( max_work != MAX_WORK) | 637 | if (max_work != MAX_WORK) |
643 | return (struct node *) tn; | 638 | return (struct node *) tn; |
644 | 639 | ||
645 | /* | 640 | /* |
@@ -966,9 +961,7 @@ fib_find_node(struct trie *t, u32 key) | |||
966 | struct node *n; | 961 | struct node *n; |
967 | 962 | ||
968 | pos = 0; | 963 | pos = 0; |
969 | n = rcu_dereference_check(t->trie, | 964 | n = rcu_dereference_rtnl(t->trie); |
970 | rcu_read_lock_held() || | ||
971 | lockdep_rtnl_is_held()); | ||
972 | 965 | ||
973 | while (n != NULL && NODE_TYPE(n) == T_TNODE) { | 966 | while (n != NULL && NODE_TYPE(n) == T_TNODE) { |
974 | tn = (struct tnode *) n; | 967 | tn = (struct tnode *) n; |
@@ -1748,16 +1741,14 @@ static struct leaf *leaf_walk_rcu(struct tnode *p, struct node *c) | |||
1748 | 1741 | ||
1749 | /* Node empty, walk back up to parent */ | 1742 | /* Node empty, walk back up to parent */ |
1750 | c = (struct node *) p; | 1743 | c = (struct node *) p; |
1751 | } while ( (p = node_parent_rcu(c)) != NULL); | 1744 | } while ((p = node_parent_rcu(c)) != NULL); |
1752 | 1745 | ||
1753 | return NULL; /* Root of trie */ | 1746 | return NULL; /* Root of trie */ |
1754 | } | 1747 | } |
1755 | 1748 | ||
1756 | static struct leaf *trie_firstleaf(struct trie *t) | 1749 | static struct leaf *trie_firstleaf(struct trie *t) |
1757 | { | 1750 | { |
1758 | struct tnode *n = (struct tnode *) rcu_dereference_check(t->trie, | 1751 | struct tnode *n = (struct tnode *)rcu_dereference_rtnl(t->trie); |
1759 | rcu_read_lock_held() || | ||
1760 | lockdep_rtnl_is_held()); | ||
1761 | 1752 | ||
1762 | if (!n) | 1753 | if (!n) |
1763 | return NULL; | 1754 | return NULL; |
@@ -2043,14 +2034,14 @@ struct fib_trie_iter { | |||
2043 | struct seq_net_private p; | 2034 | struct seq_net_private p; |
2044 | struct fib_table *tb; | 2035 | struct fib_table *tb; |
2045 | struct tnode *tnode; | 2036 | struct tnode *tnode; |
2046 | unsigned index; | 2037 | unsigned int index; |
2047 | unsigned depth; | 2038 | unsigned int depth; |
2048 | }; | 2039 | }; |
2049 | 2040 | ||
2050 | static struct node *fib_trie_get_next(struct fib_trie_iter *iter) | 2041 | static struct node *fib_trie_get_next(struct fib_trie_iter *iter) |
2051 | { | 2042 | { |
2052 | struct tnode *tn = iter->tnode; | 2043 | struct tnode *tn = iter->tnode; |
2053 | unsigned cindex = iter->index; | 2044 | unsigned int cindex = iter->index; |
2054 | struct tnode *p; | 2045 | struct tnode *p; |
2055 | 2046 | ||
2056 | /* A single entry routing table */ | 2047 | /* A single entry routing table */ |
@@ -2159,7 +2150,7 @@ static void trie_collect_stats(struct trie *t, struct trie_stat *s) | |||
2159 | */ | 2150 | */ |
2160 | static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat) | 2151 | static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat) |
2161 | { | 2152 | { |
2162 | unsigned i, max, pointers, bytes, avdepth; | 2153 | unsigned int i, max, pointers, bytes, avdepth; |
2163 | 2154 | ||
2164 | if (stat->leaves) | 2155 | if (stat->leaves) |
2165 | avdepth = stat->totdepth*100 / stat->leaves; | 2156 | avdepth = stat->totdepth*100 / stat->leaves; |
@@ -2356,7 +2347,8 @@ static void fib_trie_seq_stop(struct seq_file *seq, void *v) | |||
2356 | 2347 | ||
2357 | static void seq_indent(struct seq_file *seq, int n) | 2348 | static void seq_indent(struct seq_file *seq, int n) |
2358 | { | 2349 | { |
2359 | while (n-- > 0) seq_puts(seq, " "); | 2350 | while (n-- > 0) |
2351 | seq_puts(seq, " "); | ||
2360 | } | 2352 | } |
2361 | 2353 | ||
2362 | static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s) | 2354 | static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s) |
@@ -2388,7 +2380,7 @@ static const char *const rtn_type_names[__RTN_MAX] = { | |||
2388 | [RTN_XRESOLVE] = "XRESOLVE", | 2380 | [RTN_XRESOLVE] = "XRESOLVE", |
2389 | }; | 2381 | }; |
2390 | 2382 | ||
2391 | static inline const char *rtn_type(char *buf, size_t len, unsigned t) | 2383 | static inline const char *rtn_type(char *buf, size_t len, unsigned int t) |
2392 | { | 2384 | { |
2393 | if (t < __RTN_MAX && rtn_type_names[t]) | 2385 | if (t < __RTN_MAX && rtn_type_names[t]) |
2394 | return rtn_type_names[t]; | 2386 | return rtn_type_names[t]; |
@@ -2544,13 +2536,12 @@ static void fib_route_seq_stop(struct seq_file *seq, void *v) | |||
2544 | rcu_read_unlock(); | 2536 | rcu_read_unlock(); |
2545 | } | 2537 | } |
2546 | 2538 | ||
2547 | static unsigned fib_flag_trans(int type, __be32 mask, const struct fib_info *fi) | 2539 | static unsigned int fib_flag_trans(int type, __be32 mask, const struct fib_info *fi) |
2548 | { | 2540 | { |
2549 | static unsigned type2flags[RTN_MAX + 1] = { | 2541 | unsigned int flags = 0; |
2550 | [7] = RTF_REJECT, [8] = RTF_REJECT, | ||
2551 | }; | ||
2552 | unsigned flags = type2flags[type]; | ||
2553 | 2542 | ||
2543 | if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT) | ||
2544 | flags = RTF_REJECT; | ||
2554 | if (fi && fi->fib_nh->nh_gw) | 2545 | if (fi && fi->fib_nh->nh_gw) |
2555 | flags |= RTF_GATEWAY; | 2546 | flags |= RTF_GATEWAY; |
2556 | if (mask == htonl(0xFFFFFFFF)) | 2547 | if (mask == htonl(0xFFFFFFFF)) |
@@ -2562,7 +2553,7 @@ static unsigned fib_flag_trans(int type, __be32 mask, const struct fib_info *fi) | |||
2562 | /* | 2553 | /* |
2563 | * This outputs /proc/net/route. | 2554 | * This outputs /proc/net/route. |
2564 | * The format of the file is not supposed to be changed | 2555 | * The format of the file is not supposed to be changed |
2565 | * and needs to be same as fib_hash output to avoid breaking | 2556 | * and needs to be same as fib_hash output to avoid breaking |
2566 | * legacy utilities | 2557 | * legacy utilities |
2567 | */ | 2558 | */ |
2568 | static int fib_route_seq_show(struct seq_file *seq, void *v) | 2559 | static int fib_route_seq_show(struct seq_file *seq, void *v) |
@@ -2587,7 +2578,7 @@ static int fib_route_seq_show(struct seq_file *seq, void *v) | |||
2587 | 2578 | ||
2588 | list_for_each_entry_rcu(fa, &li->falh, fa_list) { | 2579 | list_for_each_entry_rcu(fa, &li->falh, fa_list) { |
2589 | const struct fib_info *fi = fa->fa_info; | 2580 | const struct fib_info *fi = fa->fa_info; |
2590 | unsigned flags = fib_flag_trans(fa->fa_type, mask, fi); | 2581 | unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi); |
2591 | int len; | 2582 | int len; |
2592 | 2583 | ||
2593 | if (fa->fa_type == RTN_BROADCAST | 2584 | if (fa->fa_type == RTN_BROADCAST |