diff options
author | Alexander Duyck <alexander.h.duyck@redhat.com> | 2015-03-27 17:14:22 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-31 13:18:56 -0400 |
commit | 6e47d6caff9e8af6db0741ddbd260bdd36d24c13 (patch) | |
tree | 668bcba1529c40c0117c26a10d329d28378a54ef /net | |
parent | ad88d05136386de3584867091a51927eab18dc39 (diff) |
fib_trie: Cleanup ip_fib_net_exit code path
While fixing a recent issue I noticed that we are doing some unnecessary
work inside the loop for ip_fib_net_exit. As such I am pulling out the
initialization to NULL for the locally stored fib_local, fib_main, and
fib_default.
In addition I am restoring the original code for flushing the table as
there is no need to split up the fib_table_flush and hlist_del work since
the code for packing the tnodes with multiple key vectors was dropped.
Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/fib_frontend.c | 29 |
1 files changed, 7 insertions, 22 deletions
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 767120111d90..718b0a16ea40 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
@@ -1176,35 +1176,20 @@ static void ip_fib_net_exit(struct net *net) | |||
1176 | 1176 | ||
1177 | rtnl_lock(); | 1177 | rtnl_lock(); |
1178 | 1178 | ||
1179 | #ifdef CONFIG_IP_MULTIPLE_TABLES | ||
1180 | RCU_INIT_POINTER(net->ipv4.fib_local, NULL); | ||
1181 | RCU_INIT_POINTER(net->ipv4.fib_main, NULL); | ||
1182 | RCU_INIT_POINTER(net->ipv4.fib_default, NULL); | ||
1183 | #endif | ||
1184 | |||
1179 | for (i = 0; i < FIB_TABLE_HASHSZ; i++) { | 1185 | for (i = 0; i < FIB_TABLE_HASHSZ; i++) { |
1180 | struct hlist_head *head = &net->ipv4.fib_table_hash[i]; | 1186 | struct hlist_head *head = &net->ipv4.fib_table_hash[i]; |
1181 | struct hlist_node *tmp; | 1187 | struct hlist_node *tmp; |
1182 | struct fib_table *tb; | 1188 | struct fib_table *tb; |
1183 | 1189 | ||
1184 | /* this is done in two passes as flushing the table could | ||
1185 | * cause it to be reallocated in order to accommodate new | ||
1186 | * tnodes at the root as the table shrinks. | ||
1187 | */ | ||
1188 | hlist_for_each_entry_safe(tb, tmp, head, tb_hlist) | ||
1189 | fib_table_flush(tb); | ||
1190 | |||
1191 | hlist_for_each_entry_safe(tb, tmp, head, tb_hlist) { | 1190 | hlist_for_each_entry_safe(tb, tmp, head, tb_hlist) { |
1192 | #ifdef CONFIG_IP_MULTIPLE_TABLES | ||
1193 | switch (tb->tb_id) { | ||
1194 | case RT_TABLE_LOCAL: | ||
1195 | RCU_INIT_POINTER(net->ipv4.fib_local, NULL); | ||
1196 | break; | ||
1197 | case RT_TABLE_MAIN: | ||
1198 | RCU_INIT_POINTER(net->ipv4.fib_main, NULL); | ||
1199 | break; | ||
1200 | case RT_TABLE_DEFAULT: | ||
1201 | RCU_INIT_POINTER(net->ipv4.fib_default, NULL); | ||
1202 | break; | ||
1203 | default: | ||
1204 | break; | ||
1205 | } | ||
1206 | #endif | ||
1207 | hlist_del(&tb->tb_hlist); | 1191 | hlist_del(&tb->tb_hlist); |
1192 | fib_table_flush(tb); | ||
1208 | fib_free_table(tb); | 1193 | fib_free_table(tb); |
1209 | } | 1194 | } |
1210 | } | 1195 | } |