ipv6: change fib6_rules_net_exit() to batch mode
authorEric Dumazet <edumazet@google.com>
Tue, 8 Feb 2022 04:50:33 +0000 (20:50 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 9 Feb 2022 04:41:34 +0000 (20:41 -0800)
cleanup_net() is competing with other rtnl users.

fib6_rules_net_exit() seems a good candidate for exit_batch(),
as this gives chance for cleanup_net() to progress much faster,
holding rtnl a bit longer.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/fib6_rules.c

index e2a7b00..7c20038 100644 (file)
@@ -493,16 +493,21 @@ out_fib6_rules_ops:
        goto out;
 }
 
-static void __net_exit fib6_rules_net_exit(struct net *net)
+static void __net_exit fib6_rules_net_exit_batch(struct list_head *net_list)
 {
+       struct net *net;
+
        rtnl_lock();
-       fib_rules_unregister(net->ipv6.fib6_rules_ops);
+       list_for_each_entry(net, net_list, exit_list) {
+               fib_rules_unregister(net->ipv6.fib6_rules_ops);
+               cond_resched();
+       }
        rtnl_unlock();
 }
 
 static struct pernet_operations fib6_rules_net_ops = {
        .init = fib6_rules_net_init,
-       .exit = fib6_rules_net_exit,
+       .exit_batch = fib6_rules_net_exit_batch,
 };
 
 int __init fib6_rules_init(void)