vxlan: fix a soft lockup in vxlan module removal
Subsystems (2)
PATCH 1/1 vxlan: fix a soft lockup in vxlan module removal
From: Cong Wang <[email protected]>
This is a regression introduced by:
commit fe5c3561e6f0ac7c9546209f01351113c1b77ec8 Author: stephen hemminger <[email protected]> Date: Sat Jul 13 10:18:18 2013 -0700 vxlan: add necessary locking on device removal
The problem is that vxlan_dellink(), which is called with RTNL lock held, tries to flush the workqueue synchronously, but apparently igmp_join and igmp_leave work need to hold RTNL lock too, therefore we have a soft lockup!
As suggested by Stephen, probably the flush_workqueue can just be removed and let the normal refcounting work. The workqueue has a reference to device and socket, therefore the cleanups should work correctly.
---
drivers/net/vxlan.c +0 -2
@@ -1837,8 +1837,6 @@ static void vxlan_dellink(struct net_device *dev, struct list_head *head)struct vxlan_net *vn =net_generic (dev_net (dev), vxlan_net_id);struct vxlan_dev *vxlan =netdev_priv (dev); -flush_workqueue (vxlan_wq); -spin_lock (&vn->sock_lock);hlist_del_rcu (&vxlan->hlist);spin_unlock (&vn->sock_lock);
Quoted 32 lines · On Wed, 7 Aug 2013 16:43:22 +0800 Cong Wang <[email protected]> wrote:
From: Cong Wang <[email protected]>
This is a regression introduced by:
commit fe5c3561e6f0ac7c9546209f01351113c1b77ec8 Author: stephen hemminger <[email protected]> Date: Sat Jul 13 10:18:18 2013 -0700 vxlan: add necessary locking on device removalThe problem is that
vxlan_dellink(), which is called with RTNL lock held, tries to flush the workqueue synchronously, but apparentlyigmp_joinandigmp_leavework need to hold RTNL lock too, therefore we have a soft lockup!As suggested by Stephen, probably the
flush_workqueuecan just be removed and let the normal refcounting work. The workqueue has a reference to device and socket, therefore the cleanups should work correctly.Suggested-by Stephen Hemminger <[email protected]>Cc Stephen Hemminger <[email protected]>Cc David S. Miller <[email protected]>Tested-by Cong Wang <[email protected]>Signed-off-by Cong Wang <[email protected]>---
drivers/net/vxlan.c +0
-0
drivers/net/vxlan.c static void vxlan_dellink(struct net_device *dev, struct list_head *head) · line 1842
Quoted 8 lines
drivers/net/vxlan.c +0
-2@@ -1837,8 +1837,6 @@ static void vxlan_dellink(struct net_device *dev, struct list_head *head)struct vxlan_net *vn =net_generic (dev_net (dev), vxlan_net_id);struct vxlan_dev *vxlan =netdev_priv (dev); -flush_workqueue (vxlan_wq); -spin_lock (&vn->sock_lock);hlist_del_rcu (&vxlan->hlist);spin_unlock (&vn->sock_lock);
Thanks for testing this.
From: Cong Wang <[email protected]>
Date: Wed, 7 Aug 2013 16:43:22 +0800
Quoted 20 lines
From: Cong Wang <[email protected]>
This is a regression introduced by:
commit fe5c3561e6f0ac7c9546209f01351113c1b77ec8 Author: stephen hemminger <[email protected]> Date: Sat Jul 13 10:18:18 2013 -0700 vxlan: add necessary locking on device removalThe problem is that
vxlan_dellink(), which is called with RTNL lock held, tries to flush the workqueue synchronously, but apparentlyigmp_joinandigmp_leavework need to hold RTNL lock too, therefore we have a soft lockup!As suggested by Stephen, probably the
flush_workqueuecan just be removed and let the normal refcounting work. The workqueue has a reference to device and socket, therefore the cleanups should work correctly.
Quoted 5 lines
Suggested-by Stephen Hemminger <[email protected]>Cc Stephen Hemminger <[email protected]>Cc David S. Miller <[email protected]>Tested-by Cong Wang <[email protected]>Signed-off-by Cong Wang <[email protected]>
Applied.