mirror of
https://github.com/torvalds/linux.git
synced 2026-07-29 10:41:49 +02:00
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: Kuniyuki Iwashima <kuniyu@amazon.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9302994918
commit
05be801259
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user