]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: Slim down setup_net().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 31 Jul 2024 20:07:20 +0000 (13:07 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Aug 2024 21:38:45 +0000 (22:38 +0100)
Most initialisations in setup_net() do not require pernet_ops_rwsem
and can be moved to preinit_net().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/net_namespace.c

index b91c15b27fb20def441d964ab1a88debdb7e2407..eed5a28e8ee37055ca753f8e8d70be24cbfdd5c3 100644 (file)
@@ -310,16 +310,26 @@ struct net *get_net_ns_by_id(const struct net *net, int id)
 EXPORT_SYMBOL_GPL(get_net_ns_by_id);
 
 /* init code that must occur even if setup_net() is not called. */
-static __net_init void preinit_net(struct net *net)
+static __net_init void preinit_net(struct net *net, struct user_namespace *user_ns)
 {
        refcount_set(&net->passive, 1);
+       refcount_set(&net->ns.count, 1);
+       ref_tracker_dir_init(&net->refcnt_tracker, 128, "net refcnt");
        ref_tracker_dir_init(&net->notrefcnt_tracker, 128, "net notrefcnt");
+
+       get_random_bytes(&net->hash_mix, sizeof(u32));
+       net->dev_base_seq = 1;
+       net->user_ns = user_ns;
+
+       idr_init(&net->netns_ids);
+       spin_lock_init(&net->nsid_lock);
+       mutex_init(&net->ipv4.ra_mutex);
 }
 
 /*
  * setup_net runs the initializers for the network namespace object.
  */
-static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
+static __net_init int setup_net(struct net *net)
 {
        /* Must be called with pernet_ops_rwsem held */
        const struct pernet_operations *ops, *saved_ops;
@@ -327,18 +337,9 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
        LIST_HEAD(dev_kill_list);
        int error = 0;
 
-       refcount_set(&net->ns.count, 1);
-       ref_tracker_dir_init(&net->refcnt_tracker, 128, "net refcnt");
-
-       get_random_bytes(&net->hash_mix, sizeof(u32));
        preempt_disable();
        net->net_cookie = gen_cookie_next(&net_cookie);
        preempt_enable();
-       net->dev_base_seq = 1;
-       net->user_ns = user_ns;
-       idr_init(&net->netns_ids);
-       spin_lock_init(&net->nsid_lock);
-       mutex_init(&net->ipv4.ra_mutex);
 
        list_for_each_entry(ops, &pernet_list, list) {
                error = ops_init(ops, net);
@@ -497,7 +498,7 @@ struct net *copy_net_ns(unsigned long flags,
                goto dec_ucounts;
        }
 
-       preinit_net(net);
+       preinit_net(net, user_ns);
        net->ucounts = ucounts;
        get_user_ns(user_ns);
 
@@ -505,7 +506,7 @@ struct net *copy_net_ns(unsigned long flags,
        if (rv < 0)
                goto put_userns;
 
-       rv = setup_net(net, user_ns);
+       rv = setup_net(net);
 
        up_read(&pernet_ops_rwsem);
 
@@ -1199,10 +1200,10 @@ void __init net_ns_init(void)
 #ifdef CONFIG_KEYS
        init_net.key_domain = &init_net_key_domain;
 #endif
-       preinit_net(&init_net);
+       preinit_net(&init_net, &init_user_ns);
 
        down_write(&pernet_ops_rwsem);
-       if (setup_net(&init_net, &init_user_ns))
+       if (setup_net(&init_net))
                panic("Could not setup the initial network namespace");
 
        init_net_initialized = true;