[Devel] [PATCH rh7] Revert "ve/netns: wait for sub net namespaces to exit on ve cleanup"
Kirill Tkhai
ktkhai at odin.com
Mon Jun 22 02:07:46 PDT 2015
В Вс, 21/06/2015 в 19:48 +0300, Vladimir Davydov пишет:
> This reverts commit da13b22809fc80f5493441b141f4979dedc74fb2.
>
> In RH6 we have a rather sophisticated VE-vs-netns destruction design: on
> fini_ve_netns we setup sysfs_completion, then put ve_netns, which is
> supposed to complete the completion, and then wait for the completion.
> This is needed, because net ns has a reference to ve and therefore it
> must die before ve. With sub net namespaces introduced this design gets
> even trickier: now we want all sub net namespaces to die before ve. To
> achieve that, we made each sub net ns take a reference to the ve_netns -
> this is what the patch I'm reverting did.
>
> In RH7 we don't need this crap, because each net ns takes a reference to
> the owner ve and therefore ve cannot pass away before ve_netns or any
> sub net ns.
>
> Moreover, the original patch contains a bug: it makes net_free, which is
> called from cleanup_net -> net_drop_ns, dereference net->owner_ve, the
> reference to which is dropped earlier in cleanup_net:
>
> general protection fault: 0000 [#1] SMP
> CPU: 0 PID: 343 Comm: kworker/u64:7 ve: 0 Not tainted 3.10.0+ #192 ovz.5.15-13-gfd82c5e4b758
> Workqueue: netns cleanup_net
> task: ffff8800aa030000 ti: ffff8800aab3a000 task.ti: ffff8800aab3a000
> RIP: 0010:[<ffffffff814d9626>] [<ffffffff814d9626>] net_drop_ns+0x56/0x70
> RSP: 0018:ffff8800aab3bd20 EFLAGS: 00010202
> RAX: 0000000000000000 RBX: ffff8800a8d80000 RCX: 0000000000000000
> RDX: 000000000000000e RSI: 0000000000000000 RDI: 0000000000000296
> RBP: ffff8800aab3bd30 R08: 0000000000000000 R09: 0000000100050000
> R10: 0000000000000000 R11: 0000000000000000 R12: 6b6b6b6b6b6b6b6b
> R13: ffff8800a8d80000 R14: ffff8800aab3bcf0 R15: 0000000000000800
> FS: 0000000000000000(0000) GS:ffff88010be00000(0000) knlGS:0000000000000000
> CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> CR2: 00007f0a79a1a000 CR3: 0000000000024000 CR4: 00000000000006f0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> Stack:
> ffff8800aab3bd50 ffff8800aab3bd50 ffff8800aab3bd88 ffffffff814d984e
> ffff8800a8d80050 ffff8800a8d80050 ffff8800aab3bd50 ffff8800aab3bd50
> 00000000d74acfe9 ffffffff819f3300 ffff8800aaa1fac8 ffff88010b882520
> Call Trace:
> [<ffffffff814d984e>] cleanup_net+0x20e/0x240
> [<ffffffff8108256a>] process_one_work+0x1ea/0x580
> [<ffffffff81082508>] ? process_one_work+0x188/0x580
> [<ffffffff810834fb>] worker_thread+0x11b/0x3a0
> [<ffffffff810833e0>] ? manage_workers.isra.23+0x2a0/0x2a0
> [<ffffffff8108a38a>] kthread+0xea/0xf0
> [<ffffffff8108a2a0>] ? create_kthread+0x60/0x60
> [<ffffffff8160edec>] ret_from_fork+0x7c/0xb0
> [<ffffffff8108a2a0>] ? create_kthread+0x60/0x60
>
> In fact, it's my fault: I didn't notice all of these at a quick glance
> at this patch and let it trickle through.
>
> Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
Reviewed-by: Kirill Tkhai <ktkhai at odin.com>
> ---
> net/core/net_namespace.c | 6 ------
> 1 file changed, 6 deletions(-)
>
> diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
> index 9e73cc47089b..3f7da6adbe0b 100644
> --- a/net/core/net_namespace.c
> +++ b/net/core/net_namespace.c
> @@ -165,8 +165,6 @@ static __net_init int setup_net(struct net *net, struct user_namespace *user_ns)
>
> #ifdef CONFIG_VE
> net->owner_ve = get_ve(get_exec_env());
> - if (net->owner_ve->ve_netns)
> - get_net(net->owner_ve->ve_netns);
> #endif
>
> atomic_set(&net->count, 1);
> @@ -235,7 +233,6 @@ out_free:
>
> static void net_free(struct net *net)
> {
> - struct net *ve_netns = net->owner_ve->ve_netns;
> #ifdef NETNS_REFCNT_DEBUG
> if (unlikely(atomic_read(&net->use_count) != 0)) {
> pr_emerg("network namespace not free! Usage: %d\n",
> @@ -245,9 +242,6 @@ static void net_free(struct net *net)
> #endif
> kfree(net->gen);
> kmem_cache_free(net_cachep, net);
> -
> - if (ve_netns)
> - put_net(ve_netns);
> }
>
> void net_drop_ns(void *p)
More information about the Devel
mailing list