X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fdp_notify.c;h=b7aac4e40a44f772254eae3cda0ac1bd0ce5c667;hb=8e04c6e10c28e42c715eb9fef749554c123bddbc;hp=b5178fc71ceb3463f58eb9d9a3f563d3c39b68db;hpb=91a5b5be2f1be19d22413cc4194474a48b6a2967;p=sliver-openvswitch.git diff --git a/datapath/dp_notify.c b/datapath/dp_notify.c index b5178fc71..b7aac4e40 100644 --- a/datapath/dp_notify.c +++ b/datapath/dp_notify.c @@ -66,8 +66,7 @@ void ovs_dp_notify_wq(struct work_struct *work) continue; netdev_vport = netdev_vport_priv(vport); - if (netdev_vport->dev->reg_state == NETREG_UNREGISTERED || - netdev_vport->dev->reg_state == NETREG_UNREGISTERING) + if (!(ovs_netdev_get_vport(netdev_vport->dev))) dp_detach_port_notify(vport); } } @@ -89,6 +88,10 @@ static int dp_device_event(struct notifier_block *unused, unsigned long event, return NOTIFY_DONE; if (event == NETDEV_UNREGISTER) { + /* upper_dev_unlink and decrement promisc immediately */ + ovs_netdev_detach_dev(vport); + + /* schedule vport destroy, dev_put and genl notification */ ovs_net = net_generic(dev_net(dev), ovs_net_id); queue_work(system_wq, &ovs_net->dp_notify_work); }