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); |
