diff options
Diffstat (limited to 'net/openvswitch/vport-netdev.c')
-rw-r--r-- | net/openvswitch/vport-netdev.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c index 09d93c13cfd6..d21f77d875ba 100644 --- a/net/openvswitch/vport-netdev.c +++ b/net/openvswitch/vport-netdev.c | |||
@@ -150,15 +150,25 @@ static void free_port_rcu(struct rcu_head *rcu) | |||
150 | ovs_vport_free(vport_from_priv(netdev_vport)); | 150 | ovs_vport_free(vport_from_priv(netdev_vport)); |
151 | } | 151 | } |
152 | 152 | ||
153 | static void netdev_destroy(struct vport *vport) | 153 | void ovs_netdev_detach_dev(struct vport *vport) |
154 | { | 154 | { |
155 | struct netdev_vport *netdev_vport = netdev_vport_priv(vport); | 155 | struct netdev_vport *netdev_vport = netdev_vport_priv(vport); |
156 | 156 | ||
157 | rtnl_lock(); | 157 | ASSERT_RTNL(); |
158 | netdev_vport->dev->priv_flags &= ~IFF_OVS_DATAPATH; | 158 | netdev_vport->dev->priv_flags &= ~IFF_OVS_DATAPATH; |
159 | netdev_rx_handler_unregister(netdev_vport->dev); | 159 | netdev_rx_handler_unregister(netdev_vport->dev); |
160 | netdev_upper_dev_unlink(netdev_vport->dev, get_dpdev(vport->dp)); | 160 | netdev_upper_dev_unlink(netdev_vport->dev, |
161 | netdev_master_upper_dev_get(netdev_vport->dev)); | ||
161 | dev_set_promiscuity(netdev_vport->dev, -1); | 162 | dev_set_promiscuity(netdev_vport->dev, -1); |
163 | } | ||
164 | |||
165 | static void netdev_destroy(struct vport *vport) | ||
166 | { | ||
167 | struct netdev_vport *netdev_vport = netdev_vport_priv(vport); | ||
168 | |||
169 | rtnl_lock(); | ||
170 | if (netdev_vport->dev->priv_flags & IFF_OVS_DATAPATH) | ||
171 | ovs_netdev_detach_dev(vport); | ||
162 | rtnl_unlock(); | 172 | rtnl_unlock(); |
163 | 173 | ||
164 | call_rcu(&netdev_vport->rcu, free_port_rcu); | 174 | call_rcu(&netdev_vport->rcu, free_port_rcu); |