summaryrefslogtreecommitdiff
path: root/net/ipv4
diff options
context:
space:
mode:
authorAlexander Duyck <alexander.h.duyck@redhat.com>2015-03-28 00:14:22 +0300
committerDavid S. Miller <davem@davemloft.net>2015-03-31 20:18:56 +0300
commit6e47d6caff9e8af6db0741ddbd260bdd36d24c13 (patch)
tree668bcba1529c40c0117c26a10d329d28378a54ef /net/ipv4
parentad88d05136386de3584867091a51927eab18dc39 (diff)
downloadlinux-6e47d6caff9e8af6db0741ddbd260bdd36d24c13.tar.xz
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/ipv4')
-rw-r--r--net/ipv4/fib_frontend.c29
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)
rtnl_lock();
+#ifdef CONFIG_IP_MULTIPLE_TABLES
+ RCU_INIT_POINTER(net->ipv4.fib_local, NULL);
+ RCU_INIT_POINTER(net->ipv4.fib_main, NULL);
+ RCU_INIT_POINTER(net->ipv4.fib_default, NULL);
+#endif
+
for (i = 0; i < FIB_TABLE_HASHSZ; i++) {
struct hlist_head *head = &net->ipv4.fib_table_hash[i];
struct hlist_node *tmp;
struct fib_table *tb;
- /* this is done in two passes as flushing the table could
- * cause it to be reallocated in order to accommodate new
- * tnodes at the root as the table shrinks.
- */
- hlist_for_each_entry_safe(tb, tmp, head, tb_hlist)
- fib_table_flush(tb);
-
hlist_for_each_entry_safe(tb, tmp, head, tb_hlist) {
-#ifdef CONFIG_IP_MULTIPLE_TABLES
- switch (tb->tb_id) {
- case RT_TABLE_LOCAL:
- RCU_INIT_POINTER(net->ipv4.fib_local, NULL);
- break;
- case RT_TABLE_MAIN:
- RCU_INIT_POINTER(net->ipv4.fib_main, NULL);
- break;
- case RT_TABLE_DEFAULT:
- RCU_INIT_POINTER(net->ipv4.fib_default, NULL);
- break;
- default:
- break;
- }
-#endif
hlist_del(&tb->tb_hlist);
+ fib_table_flush(tb);
fib_free_table(tb);
}
}