From 3ff35bf371268d616226aec08d00aa6e6e504f57 Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Wed, 28 Nov 2012 14:01:52 -0800 Subject: [PATCH] --- yaml --- r: 341636 b: refs/heads/master c: 92eb1d477145b2e7780b5002e856f70b8c3d74da h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/openvswitch/vport-netdev.c | 14 ++++++++++---- trunk/net/openvswitch/vport-netdev.h | 3 +++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index bc2697e706c6..f8b2634fd876 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 39c7caebc94e851f58b84b54659156dd30522e8e +refs/heads/master: 92eb1d477145b2e7780b5002e856f70b8c3d74da diff --git a/trunk/net/openvswitch/vport-netdev.c b/trunk/net/openvswitch/vport-netdev.c index a9033481fa5e..a9327e2e48ce 100644 --- a/trunk/net/openvswitch/vport-netdev.c +++ b/trunk/net/openvswitch/vport-netdev.c @@ -114,6 +114,15 @@ static struct vport *netdev_create(const struct vport_parms *parms) return ERR_PTR(err); } +static void free_port_rcu(struct rcu_head *rcu) +{ + struct netdev_vport *netdev_vport = container_of(rcu, + struct netdev_vport, rcu); + + dev_put(netdev_vport->dev); + ovs_vport_free(vport_from_priv(netdev_vport)); +} + static void netdev_destroy(struct vport *vport) { struct netdev_vport *netdev_vport = netdev_vport_priv(vport); @@ -122,10 +131,7 @@ static void netdev_destroy(struct vport *vport) netdev_rx_handler_unregister(netdev_vport->dev); dev_set_promiscuity(netdev_vport->dev, -1); - synchronize_rcu(); - - dev_put(netdev_vport->dev); - ovs_vport_free(vport); + call_rcu(&netdev_vport->rcu, free_port_rcu); } const char *ovs_netdev_get_name(const struct vport *vport) diff --git a/trunk/net/openvswitch/vport-netdev.h b/trunk/net/openvswitch/vport-netdev.h index f7072a25c604..6478079b3417 100644 --- a/trunk/net/openvswitch/vport-netdev.h +++ b/trunk/net/openvswitch/vport-netdev.h @@ -20,12 +20,15 @@ #define VPORT_NETDEV_H 1 #include +#include #include "vport.h" struct vport *ovs_netdev_get_vport(struct net_device *dev); struct netdev_vport { + struct rcu_head rcu; + struct net_device *dev; };