Commit 05be8012 authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by David S. Miller

net: Slim down setup_net().

Most initialisations in setup_net() do not require pernet_ops_rwsem
and can be moved to preinit_net().
Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 93029949
...@@ -310,16 +310,26 @@ struct net *get_net_ns_by_id(const struct net *net, int id) ...@@ -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); EXPORT_SYMBOL_GPL(get_net_ns_by_id);
/* init code that must occur even if setup_net() is not called. */ /* 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->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"); 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. * 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 */ /* Must be called with pernet_ops_rwsem held */
const struct pernet_operations *ops, *saved_ops; 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) ...@@ -327,18 +337,9 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
LIST_HEAD(dev_kill_list); LIST_HEAD(dev_kill_list);
int error = 0; 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(); preempt_disable();
net->net_cookie = gen_cookie_next(&net_cookie); net->net_cookie = gen_cookie_next(&net_cookie);
preempt_enable(); 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) { list_for_each_entry(ops, &pernet_list, list) {
error = ops_init(ops, net); error = ops_init(ops, net);
...@@ -497,7 +498,7 @@ struct net *copy_net_ns(unsigned long flags, ...@@ -497,7 +498,7 @@ struct net *copy_net_ns(unsigned long flags,
goto dec_ucounts; goto dec_ucounts;
} }
preinit_net(net); preinit_net(net, user_ns);
net->ucounts = ucounts; net->ucounts = ucounts;
get_user_ns(user_ns); get_user_ns(user_ns);
...@@ -505,7 +506,7 @@ struct net *copy_net_ns(unsigned long flags, ...@@ -505,7 +506,7 @@ struct net *copy_net_ns(unsigned long flags,
if (rv < 0) if (rv < 0)
goto put_userns; goto put_userns;
rv = setup_net(net, user_ns); rv = setup_net(net);
up_read(&pernet_ops_rwsem); up_read(&pernet_ops_rwsem);
...@@ -1199,10 +1200,10 @@ void __init net_ns_init(void) ...@@ -1199,10 +1200,10 @@ void __init net_ns_init(void)
#ifdef CONFIG_KEYS #ifdef CONFIG_KEYS
init_net.key_domain = &init_net_key_domain; init_net.key_domain = &init_net_key_domain;
#endif #endif
preinit_net(&init_net); preinit_net(&init_net, &init_user_ns);
down_write(&pernet_ops_rwsem); 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"); panic("Could not setup the initial network namespace");
init_net_initialized = true; init_net_initialized = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment