Skip to content

Commit 05be801

Browse files
q2vendavem330
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9302994 commit 05be801

File tree

1 file changed

+16
-15
lines changed

1 file changed

+16
-15
lines changed

net/core/net_namespace.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -310,35 +310,36 @@ struct net *get_net_ns_by_id(const struct net *net, int id)
310310
EXPORT_SYMBOL_GPL(get_net_ns_by_id);
311311

312312
/* init code that must occur even if setup_net() is not called. */
313-
static __net_init void preinit_net(struct net *net)
313+
static __net_init void preinit_net(struct net *net, struct user_namespace *user_ns)
314314
{
315315
refcount_set(&net->passive, 1);
316+
refcount_set(&net->ns.count, 1);
317+
ref_tracker_dir_init(&net->refcnt_tracker, 128, "net refcnt");
316318
ref_tracker_dir_init(&net->notrefcnt_tracker, 128, "net notrefcnt");
319+
320+
get_random_bytes(&net->hash_mix, sizeof(u32));
321+
net->dev_base_seq = 1;
322+
net->user_ns = user_ns;
323+
324+
idr_init(&net->netns_ids);
325+
spin_lock_init(&net->nsid_lock);
326+
mutex_init(&net->ipv4.ra_mutex);
317327
}
318328

319329
/*
320330
* setup_net runs the initializers for the network namespace object.
321331
*/
322-
static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
332+
static __net_init int setup_net(struct net *net)
323333
{
324334
/* Must be called with pernet_ops_rwsem held */
325335
const struct pernet_operations *ops, *saved_ops;
326336
LIST_HEAD(net_exit_list);
327337
LIST_HEAD(dev_kill_list);
328338
int error = 0;
329339

330-
refcount_set(&net->ns.count, 1);
331-
ref_tracker_dir_init(&net->refcnt_tracker, 128, "net refcnt");
332-
333-
get_random_bytes(&net->hash_mix, sizeof(u32));
334340
preempt_disable();
335341
net->net_cookie = gen_cookie_next(&net_cookie);
336342
preempt_enable();
337-
net->dev_base_seq = 1;
338-
net->user_ns = user_ns;
339-
idr_init(&net->netns_ids);
340-
spin_lock_init(&net->nsid_lock);
341-
mutex_init(&net->ipv4.ra_mutex);
342343

343344
list_for_each_entry(ops, &pernet_list, list) {
344345
error = ops_init(ops, net);
@@ -497,15 +498,15 @@ struct net *copy_net_ns(unsigned long flags,
497498
goto dec_ucounts;
498499
}
499500

500-
preinit_net(net);
501+
preinit_net(net, user_ns);
501502
net->ucounts = ucounts;
502503
get_user_ns(user_ns);
503504

504505
rv = down_read_killable(&pernet_ops_rwsem);
505506
if (rv < 0)
506507
goto put_userns;
507508

508-
rv = setup_net(net, user_ns);
509+
rv = setup_net(net);
509510

510511
up_read(&pernet_ops_rwsem);
511512

@@ -1199,10 +1200,10 @@ void __init net_ns_init(void)
11991200
#ifdef CONFIG_KEYS
12001201
init_net.key_domain = &init_net_key_domain;
12011202
#endif
1202-
preinit_net(&init_net);
1203+
preinit_net(&init_net, &init_user_ns);
12031204

12041205
down_write(&pernet_ops_rwsem);
1205-
if (setup_net(&init_net, &init_user_ns))
1206+
if (setup_net(&init_net))
12061207
panic("Could not setup the initial network namespace");
12071208

12081209
init_net_initialized = true;

0 commit comments

Comments
 (0)