Message ID | 1373493884-7915-1-git-send-email-pshelar@nicira.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, 10 Jul 2013 15:04:44 -0700 Pravin B Shelar <pshelar@nicira.com> wrote: > Use rtnl lock to protect vs->vni_list updates. > > Signed-off-by: Pravin B Shelar <pshelar@nicira.com> > --- I don't think this is necessary. I intentionally changed the locking when socket management was moved to a work queue. The vxlan_net socket lock is held there already, and finer grain. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Jul 10, 2013 at 3:58 PM, Stephen Hemminger <stephen@networkplumber.org> wrote: > On Wed, 10 Jul 2013 15:04:44 -0700 > Pravin B Shelar <pshelar@nicira.com> wrote: > >> Use rtnl lock to protect vs->vni_list updates. >> >> Signed-off-by: Pravin B Shelar <pshelar@nicira.com> >> --- > > I don't think this is necessary. I intentionally changed the > locking when socket management was moved to a work queue. > The vxlan_net socket lock is held there already, and finer grain. what abt vxlan_dellink()? it is deleting vxlan-dev from hash table without lock. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 227b54a..deca481 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -89,7 +89,7 @@ struct vxlan_sock { struct work_struct del_work; atomic_t refcnt; struct socket *sock; - struct hlist_head vni_list[VNI_HASH_SIZE]; + struct hlist_head vni_list[VNI_HASH_SIZE]; /* Protected by RTNL. */ }; /* per-network namespace private data for this module */ @@ -122,7 +122,7 @@ struct vxlan_fdb { /* Pseudo network device */ struct vxlan_dev { - struct hlist_node hlist; /* vni hash table */ + struct hlist_node hlist; /* vni hash table (vni_list) */ struct list_head next; /* vxlan's per namespace list */ struct vxlan_sock *vn_sock; /* listening socket */ struct net_device *dev; @@ -1644,16 +1644,21 @@ static void vxlan_sock_work(struct work_struct *work) if (ovs) { atomic_inc(&ovs->refcnt); vxlan->vn_sock = ovs; - hlist_add_head_rcu(&vxlan->hlist, vni_head(ovs, vni)); spin_unlock(&vn->sock_lock); + rtnl_lock(); + hlist_add_head_rcu(&vxlan->hlist, vni_head(ovs, vni)); + rtnl_unlock(); + sk_release_kernel(nvs->sock->sk); kfree(nvs); } else { vxlan->vn_sock = nvs; hlist_add_head_rcu(&nvs->hlist, vs_head(net, port)); - hlist_add_head_rcu(&vxlan->hlist, vni_head(nvs, vni)); spin_unlock(&vn->sock_lock); + rtnl_lock(); + hlist_add_head_rcu(&vxlan->hlist, vni_head(nvs, vni)); + rtnl_unlock(); } out: dev_put(dev);
Use rtnl lock to protect vs->vni_list updates. Signed-off-by: Pravin B Shelar <pshelar@nicira.com> --- drivers/net/vxlan.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-)