X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fdp_notify.c;h=0b22d0c19459a57492edca38e0973d86c44f315c;hb=4fa72a95722f74ebee61254f06bb171e9207f9c1;hp=ec573a51f6c458181bc603f662db7ede9d1f19f6;hpb=cd2a59e99c8a94b15655e29a4dc100a0dc221568;p=sliver-openvswitch.git diff --git a/datapath/dp_notify.c b/datapath/dp_notify.c index ec573a51f..0b22d0c19 100644 --- a/datapath/dp_notify.c +++ b/datapath/dp_notify.c @@ -18,6 +18,8 @@ #include #include +#include +#include #include "datapath.h" #include "vport-internal_dev.h" @@ -33,7 +35,7 @@ static void dp_detach_port_notify(struct vport *vport) OVS_VPORT_CMD_DEL); ovs_dp_detach_port(vport); if (IS_ERR(notify)) { - netlink_set_err(GENL_SOCK(ovs_dp_get_net(dp)), 0, + netlink_set_err(ovs_dp_get_net(dp)->genl_sock, 0, ovs_dp_vport_multicast_group.id, PTR_ERR(notify)); return; @@ -64,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); } } @@ -77,7 +78,7 @@ static int dp_device_event(struct notifier_block *unused, unsigned long event, void *ptr) { struct ovs_net *ovs_net; - struct net_device *dev = ptr; + struct net_device *dev = netdev_notifier_info_to_dev(ptr); struct vport *vport = NULL; if (!ovs_is_internal_dev(dev)) @@ -87,8 +88,12 @@ 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(&ovs_net->dp_notify_work); + queue_work(system_wq, &ovs_net->dp_notify_work); } return NOTIFY_DONE;