[Devel] [PATCH RHEL7 COMMIT] Revert "ve/netns: wait for sub net namespaces to exit on ve cleanup"

Konstantin Khorenko khorenko at virtuozzo.com
Mon Jun 22 04:02:19 PDT 2015


The commit is pushed to "branch-rh7-3.10.0-123.1.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-123.1.2.vz7.5.15
------>
commit 008d793b66f2bbd4723c2002537baee676b533bd
Author: Vladimir Davydov <vdavydov at parallels.com>
Date:   Mon Jun 22 15:02:19 2015 +0400

    Revert "ve/netns: wait for sub net namespaces to exit on ve cleanup"
    
    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: Cyrill Gorcunov <gorcunov at openvz.org>
    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 9e73cc4..3f7da6a 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