From patchwork Wed Mar 6 14:37:37 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zang MingJie X-Patchwork-Id: 225510 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 88A9D2C02B5 for ; Thu, 7 Mar 2013 01:39:22 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932069Ab3CFOjG (ORCPT ); Wed, 6 Mar 2013 09:39:06 -0500 Received: from mail-pb0-f42.google.com ([209.85.160.42]:40165 "EHLO mail-pb0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758429Ab3CFOjC (ORCPT ); Wed, 6 Mar 2013 09:39:02 -0500 Received: by mail-pb0-f42.google.com with SMTP id xb4so6081339pbc.29 for ; Wed, 06 Mar 2013 06:39:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer; bh=Lah3ghddwiI8SnJVy+ryuthrEXMkg7kUN5nSRyODCRM=; b=Fhqb4QVhs7IL7Avbm5APw6TVF/ncXPq94tuO4bvYpfAWDNIW3Zp3XJLaLZRXw/kUIk xTJvhLARPaQpo4e94agFEEA71zPgRE2dcHHj47OnxPW37jVI8exIFNS3G1Y405ASfEmZ 1ndL4TIEuuvSpfUk74+hs93BlUbVkHICMz82WwsD8Fv9LUZ2CdEkZCwYR2S2cVH5CCIx E5jZtXB2rzKAeixV0Y1d1VaREoeMtwFGSltUq2P0C4lSetAHBfA0W5krGzTnjWhHt8mc eU3A6crMFHJBVNRFWJjDGfHS6ujd+No/aenaCsWyNL/oJInQwhGbKS3zdN/kwmOJk4ab uNow== X-Received: by 10.68.134.201 with SMTP id pm9mr46039706pbb.182.1362580741831; Wed, 06 Mar 2013 06:39:01 -0800 (PST) Received: from localhost (li414-6.members.linode.com. [106.187.94.6]) by mx.google.com with ESMTPS id hu2sm31571220pbc.38.2013.03.06.06.38.58 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 06 Mar 2013 06:39:00 -0800 (PST) Received: from kghost by localhost with local (Exim 4.80) (envelope-from ) id 1UDFUd-0006fh-6E; Wed, 06 Mar 2013 22:38:55 +0800 From: Zang MingJie To: netdev@vger.kernel.org Cc: "David S. Miller" , Zang MingJie Subject: [PATCH 1/1] vxlan: fix oops when delete netns containing vxlan Date: Wed, 6 Mar 2013 22:37:37 +0800 Message-Id: <1362580657-25580-1-git-send-email-zealot0630@gmail.com> X-Mailer: git-send-email 1.7.10.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The following script will produce a kernel oops: sudo ip netns add v sudo ip netns exec v ip ad add 127.0.0.1/8 dev lo sudo ip netns exec v ip link set lo up sudo ip netns exec v ip ro add 224.0.0.0/4 dev lo sudo ip netns exec v ip li add vxlan0 type vxlan id 42 group 239.1.1.1 dev lo sudo ip netns exec v ip link set vxlan0 up sudo ip netns del v where inspect by gdb: Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 107] 0xffffffffa0289e33 in ?? () (gdb) bt #0 vxlan_leave_group (dev=0xffff88001bafa000) at drivers/net/vxlan.c:533 #1 vxlan_stop (dev=0xffff88001bafa000) at drivers/net/vxlan.c:1087 #2 0xffffffff812cc498 in __dev_close_many (head=head@entry=0xffff88001f2e7dc8) at net/core/dev.c:1299 #3 0xffffffff812cd920 in dev_close_many (head=head@entry=0xffff88001f2e7dc8) at net/core/dev.c:1335 #4 0xffffffff812cef31 in rollback_registered_many (head=head@entry=0xffff88001f2e7dc8) at net/core/dev.c:4851 #5 0xffffffff812cf040 in unregister_netdevice_many (head=head@entry=0xffff88001f2e7dc8) at net/core/dev.c:5752 #6 0xffffffff812cf1ba in default_device_exit_batch (net_list=0xffff88001f2e7e18) at net/core/dev.c:6170 #7 0xffffffff812cab27 in cleanup_net (work=) at net/core/net_namespace.c:302 #8 0xffffffff810540ef in process_one_work (worker=0xffff88001ba9ed40, work=0xffffffff8167d020) at kernel/workqueue.c:2157 #9 0xffffffff810549d0 in worker_thread (__worker=__worker@entry=0xffff88001ba9ed40) at kernel/workqueue.c:2276 #10 0xffffffff8105870c in kthread (_create=0xffff88001f2e5d68) at kernel/kthread.c:168 #11 #12 0x0000000000000000 in ?? () #13 0x0000000000000000 in ?? () (gdb) fr 0 #0 vxlan_leave_group (dev=0xffff88001bafa000) at drivers/net/vxlan.c:533 533 struct sock *sk = vn->sock->sk; (gdb) l 528 static int vxlan_leave_group(struct net_device *dev) 529 { 530 struct vxlan_dev *vxlan = netdev_priv(dev); 531 struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id); 532 int err = 0; 533 struct sock *sk = vn->sock->sk; 534 struct ip_mreqn mreq = { 535 .imr_multiaddr.s_addr = vxlan->gaddr, 536 .imr_ifindex = vxlan->link, 537 }; (gdb) p vn->sock $4 = (struct socket *) 0x0 The kernel calls `vxlan_exit_net` when deleting the netns before shutting down vxlan interfaces. Later the removal of all vxlan interfaces, where `vn->sock` is already gone causes the oops. so we should manually shutdown all interfaces before deleting `vn->sock` as the patch does. Signed-off-by: Zang MingJie --- drivers/net/vxlan.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index c3e3d29..7cee7a3 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -1506,6 +1506,14 @@ static __net_init int vxlan_init_net(struct net *net) static __net_exit void vxlan_exit_net(struct net *net) { struct vxlan_net *vn = net_generic(net, vxlan_net_id); + struct vxlan_dev *vxlan; + unsigned h; + + rtnl_lock(); + for (h = 0; h < VNI_HASH_SIZE; ++h) + hlist_for_each_entry(vxlan, &vn->vni_list[h], hlist) + dev_close(vxlan->dev); + rtnl_unlock(); if (vn->sock) { sk_release_kernel(vn->sock->sk);