fib_trie: Cleanup ip_fib_net_exit code path
authorAlexander Duyck <alexander.h.duyck@redhat.com>
Fri, 27 Mar 2015 21:14:22 +0000 (14:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 31 Mar 2015 17:18:56 +0000 (13:18 -0400)
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>
net/ipv4/fib_frontend.c

index 767120111d90df55ca7b0f949e6dadd760af54d5..718b0a16ea409ef06fd889d397ff17657b7e1790 100644 (file)
@@ -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);
                }
        }