Skip to content

Commit 094374e

Browse files
Kirill Tkhaidavem330
authored andcommitted
net: Reflect all pernet_operations are converted
All pernet_operations are reviewed and converted, hooray! Reflect this in core code: setup_net() and cleanup_net() will take down_read() always. Signed-off-by: Kirill Tkhai <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 67441c2 commit 094374e

File tree

1 file changed

+6
-37
lines changed

1 file changed

+6
-37
lines changed

net/core/net_namespace.c

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,8 @@ struct net init_net = {
4040
EXPORT_SYMBOL(init_net);
4141

4242
static bool init_net_initialized;
43-
static unsigned nr_sync_pernet_ops;
4443
/*
45-
* net_sem: protects: pernet_list, net_generic_ids, nr_sync_pernet_ops,
44+
* net_sem: protects: pernet_list, net_generic_ids,
4645
* init_net_initialized and first_device pointer.
4746
*/
4847
DECLARE_RWSEM(net_sem);
@@ -406,7 +405,6 @@ struct net *copy_net_ns(unsigned long flags,
406405
{
407406
struct ucounts *ucounts;
408407
struct net *net;
409-
unsigned write;
410408
int rv;
411409

412410
if (!(flags & CLONE_NEWNET))
@@ -424,25 +422,14 @@ struct net *copy_net_ns(unsigned long flags,
424422
refcount_set(&net->passive, 1);
425423
net->ucounts = ucounts;
426424
get_user_ns(user_ns);
427-
again:
428-
write = READ_ONCE(nr_sync_pernet_ops);
429-
if (write)
430-
rv = down_write_killable(&net_sem);
431-
else
432-
rv = down_read_killable(&net_sem);
425+
426+
rv = down_read_killable(&net_sem);
433427
if (rv < 0)
434428
goto put_userns;
435429

436-
if (!write && unlikely(READ_ONCE(nr_sync_pernet_ops))) {
437-
up_read(&net_sem);
438-
goto again;
439-
}
440430
rv = setup_net(net, user_ns);
441431

442-
if (write)
443-
up_write(&net_sem);
444-
else
445-
up_read(&net_sem);
432+
up_read(&net_sem);
446433

447434
if (rv < 0) {
448435
put_userns:
@@ -490,21 +477,11 @@ static void cleanup_net(struct work_struct *work)
490477
struct net *net, *tmp, *last;
491478
struct llist_node *net_kill_list;
492479
LIST_HEAD(net_exit_list);
493-
unsigned write;
494480

495481
/* Atomically snapshot the list of namespaces to cleanup */
496482
net_kill_list = llist_del_all(&cleanup_list);
497-
again:
498-
write = READ_ONCE(nr_sync_pernet_ops);
499-
if (write)
500-
down_write(&net_sem);
501-
else
502-
down_read(&net_sem);
503483

504-
if (!write && unlikely(READ_ONCE(nr_sync_pernet_ops))) {
505-
up_read(&net_sem);
506-
goto again;
507-
}
484+
down_read(&net_sem);
508485

509486
/* Don't let anyone else find us. */
510487
rtnl_lock();
@@ -543,10 +520,7 @@ static void cleanup_net(struct work_struct *work)
543520
list_for_each_entry_reverse(ops, &pernet_list, list)
544521
ops_free_list(ops, &net_exit_list);
545522

546-
if (write)
547-
up_write(&net_sem);
548-
else
549-
up_read(&net_sem);
523+
up_read(&net_sem);
550524

551525
/* Ensure there are no outstanding rcu callbacks using this
552526
* network namespace.
@@ -1006,18 +980,13 @@ static int register_pernet_operations(struct list_head *list,
1006980
rcu_barrier();
1007981
if (ops->id)
1008982
ida_remove(&net_generic_ids, *ops->id);
1009-
} else if (!ops->async) {
1010-
pr_info_once("Pernet operations %ps are sync.\n", ops);
1011-
nr_sync_pernet_ops++;
1012983
}
1013984

1014985
return error;
1015986
}
1016987

1017988
static void unregister_pernet_operations(struct pernet_operations *ops)
1018989
{
1019-
if (!ops->async)
1020-
BUG_ON(nr_sync_pernet_ops-- == 0);
1021990
__unregister_pernet_operations(ops);
1022991
rcu_barrier();
1023992
if (ops->id)

0 commit comments

Comments
 (0)