ipv4: fib: Hold rtnl_net_lock() for ip_fib_net_exit().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Fri, 28 Feb 2025 04:23:25 +0000 (20:23 -0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 3 Mar 2025 23:04:11 +0000 (15:04 -0800)
ip_fib_net_exit() requires RTNL and is called from fib_net_init()
and fib_net_exit_batch().

Let's hold rtnl_net_lock() before ip_fib_net_exit().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20250228042328.96624-10-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/fib_frontend.c

index 40c062f820f2d17890b11d7cd8374c6bfa475eff..c48ed369b1796abd5de94838e8c272b163148aec 100644 (file)
@@ -1575,7 +1575,7 @@ static void ip_fib_net_exit(struct net *net)
 {
        int i;
 
-       ASSERT_RTNL();
+       ASSERT_RTNL_NET(net);
 #ifdef CONFIG_IP_MULTIPLE_TABLES
        RCU_INIT_POINTER(net->ipv4.fib_main, NULL);
        RCU_INIT_POINTER(net->ipv4.fib_default, NULL);
@@ -1635,9 +1635,9 @@ out_proc:
 out_nlfl:
        fib4_semantics_exit(net);
 out_semantics:
-       rtnl_lock();
+       rtnl_net_lock(net);
        ip_fib_net_exit(net);
-       rtnl_unlock();
+       rtnl_net_unlock(net);
        goto out;
 }
 
@@ -1652,9 +1652,11 @@ static void __net_exit fib_net_exit_batch(struct list_head *net_list)
        struct net *net;
 
        rtnl_lock();
-       list_for_each_entry(net, net_list, exit_list)
+       list_for_each_entry(net, net_list, exit_list) {
+               __rtnl_net_lock(net);
                ip_fib_net_exit(net);
-
+               __rtnl_net_unlock(net);
+       }
        rtnl_unlock();
 
        list_for_each_entry(net, net_list, exit_list)