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

nexthop_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/ipv4/nexthop.c

index eeafecc..e459a39 100644 (file)
@@ -3733,12 +3733,16 @@ out:
 }
 EXPORT_SYMBOL(nexthop_res_grp_activity_update);
 
-static void __net_exit nexthop_net_exit(struct net *net)
+static void __net_exit nexthop_net_exit_batch(struct list_head *net_list)
 {
+       struct net *net;
+
        rtnl_lock();
-       flush_all_nexthops(net);
+       list_for_each_entry(net, net_list, exit_list) {
+               flush_all_nexthops(net);
+               kfree(net->nexthop.devhash);
+       }
        rtnl_unlock();
-       kfree(net->nexthop.devhash);
 }
 
 static int __net_init nexthop_net_init(struct net *net)
@@ -3756,7 +3760,7 @@ static int __net_init nexthop_net_init(struct net *net)
 
 static struct pernet_operations nexthop_net_ops = {
        .init = nexthop_net_init,
-       .exit = nexthop_net_exit,
+       .exit_batch = nexthop_net_exit_batch,
 };
 
 static int __init nexthop_init(void)