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

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
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -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;