]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: Drop hold_rtnl arg from ops_undo_list().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Fri, 18 Apr 2025 00:32:32 +0000 (17:32 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 23 Apr 2025 02:07:41 +0000 (19:07 -0700)
ops_undo_list() first iterates over ops_list for ->pre_exit().

Let's check if any of the ops has ->exit_rtnl() there and drop
the hold_rtnl argument.

Note that nexthop uses ->exit_rtnl() and is built-in, so hold_rtnl
is always true for setup_net() and cleanup_net() for now.

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/netdev/20250414170148.21f3523c@kernel.org/
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250418003259.48017-2-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/net_namespace.c

index 0a2b24af4028048c3520b3ad23e96bff9056f194..48dd6dc603c9edb40f1d16d7dfdff1c508e10212 100644 (file)
@@ -220,17 +220,20 @@ static void ops_free_list(const struct pernet_operations *ops,
 static void ops_undo_list(const struct list_head *ops_list,
                          const struct pernet_operations *ops,
                          struct list_head *net_exit_list,
-                         bool expedite_rcu, bool hold_rtnl)
+                         bool expedite_rcu)
 {
        const struct pernet_operations *saved_ops;
+       bool hold_rtnl = false;
 
        if (!ops)
                ops = list_entry(ops_list, typeof(*ops), list);
 
        saved_ops = ops;
 
-       list_for_each_entry_continue_reverse(ops, ops_list, list)
+       list_for_each_entry_continue_reverse(ops, ops_list, list) {
+               hold_rtnl |= !!ops->exit_rtnl;
                ops_pre_exit_list(ops, net_exit_list);
+       }
 
        /* Another CPU might be rcu-iterating the list, wait for it.
         * This needs to be before calling the exit() notifiers, so the
@@ -257,11 +260,10 @@ static void ops_undo_list(const struct list_head *ops_list,
 static void ops_undo_single(struct pernet_operations *ops,
                            struct list_head *net_exit_list)
 {
-       bool hold_rtnl = !!ops->exit_rtnl;
        LIST_HEAD(ops_list);
 
        list_add(&ops->list, &ops_list);
-       ops_undo_list(&ops_list, NULL, net_exit_list, false, hold_rtnl);
+       ops_undo_list(&ops_list, NULL, net_exit_list, false);
        list_del(&ops->list);
 }
 
@@ -452,7 +454,7 @@ out_undo:
         * for the pernet modules whose init functions did not fail.
         */
        list_add(&net->exit_list, &net_exit_list);
-       ops_undo_list(&pernet_list, ops, &net_exit_list, false, true);
+       ops_undo_list(&pernet_list, ops, &net_exit_list, false);
        rcu_barrier();
        goto out;
 }
@@ -681,7 +683,7 @@ static void cleanup_net(struct work_struct *work)
                list_add_tail(&net->exit_list, &net_exit_list);
        }
 
-       ops_undo_list(&pernet_list, NULL, &net_exit_list, true, true);
+       ops_undo_list(&pernet_list, NULL, &net_exit_list, true);
 
        up_read(&pernet_ops_rwsem);