diff options
author | Alexander Duyck <alexander.h.duyck@redhat.com> | 2015-03-28 00:14:22 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-03-31 20:18:56 +0300 |
commit | 6e47d6caff9e8af6db0741ddbd260bdd36d24c13 (patch) | |
tree | 668bcba1529c40c0117c26a10d329d28378a54ef /net | |
parent | ad88d05136386de3584867091a51927eab18dc39 (diff) | |
download | linux-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')
-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) 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); } } |