ipvs: batch __ip_vs_dev_cleanup
authorHaishuang Yan <yanhaishuang@cmss.chinamobile.com>
Fri, 27 Sep 2019 04:54:51 +0000 (12:54 +0800)
committerSimon Horman <horms@verge.net.au>
Tue, 8 Oct 2019 09:28:33 +0000 (11:28 +0200)
It's better to batch __ip_vs_cleanup to speedup ipvs
devices dismantle.

Signed-off-by: Haishuang Yan <yanhaishuang@cmss.chinamobile.com>
Acked-by: Julian Anastasov <ja@ssi.bg>
Signed-off-by: Simon Horman <horms@verge.net.au>
net/netfilter/ipvs/ip_vs_core.c

index 93cfb47823d1a8e4be7d1f7bf7f6e403c3feb8ff..512259f579d77cd46b8c5f70a865513e5b0efd32 100644 (file)
@@ -2433,14 +2433,19 @@ hook_fail:
        return ret;
 }
 
-static void __net_exit __ip_vs_dev_cleanup(struct net *net)
+static void __net_exit __ip_vs_dev_cleanup_batch(struct list_head *net_list)
 {
-       struct netns_ipvs *ipvs = net_ipvs(net);
+       struct netns_ipvs *ipvs;
+       struct net *net;
+
        EnterFunction(2);
-       nf_unregister_net_hooks(net, ip_vs_ops, ARRAY_SIZE(ip_vs_ops));
-       ipvs->enable = 0;       /* Disable packet reception */
-       smp_wmb();
-       ip_vs_sync_net_cleanup(ipvs);
+       list_for_each_entry(net, net_list, exit_list) {
+               ipvs = net_ipvs(net);
+               nf_unregister_net_hooks(net, ip_vs_ops, ARRAY_SIZE(ip_vs_ops));
+               ipvs->enable = 0;       /* Disable packet reception */
+               smp_wmb();
+               ip_vs_sync_net_cleanup(ipvs);
+       }
        LeaveFunction(2);
 }
 
@@ -2453,7 +2458,7 @@ static struct pernet_operations ipvs_core_ops = {
 
 static struct pernet_operations ipvs_core_dev_ops = {
        .init = __ip_vs_dev_init,
-       .exit = __ip_vs_dev_cleanup,
+       .exit_batch = __ip_vs_dev_cleanup_batch,
 };
 
 /*