X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fdp_notify.c;h=f9a037510d0d877c0355efc5e7355f854dfc6320;hb=cfc50ae514f805dcd9c14589f21158185424daf6;hp=b5178fc71ceb3463f58eb9d9a3f563d3c39b68db;hpb=533e96e7baa8c195bb6e7f3e0cdd3cd72e3a37e7;p=sliver-openvswitch.git diff --git a/datapath/dp_notify.c b/datapath/dp_notify.c index b5178fc71..f9a037510 100644 --- a/datapath/dp_notify.c +++ b/datapath/dp_notify.c @@ -31,18 +31,18 @@ static void dp_detach_port_notify(struct vport *vport) struct datapath *dp; dp = vport->dp; - notify = ovs_vport_cmd_build_info(vport, 0, 0, - OVS_VPORT_CMD_DEL); + notify = ovs_vport_cmd_build_info(vport, 0, 0, OVS_VPORT_CMD_DEL); ovs_dp_detach_port(vport); if (IS_ERR(notify)) { - netlink_set_err(ovs_dp_get_net(dp)->genl_sock, 0, - ovs_dp_vport_multicast_group.id, - PTR_ERR(notify)); + genl_set_err(&dp_vport_genl_family, ovs_dp_get_net(dp), 0, + GROUP_ID(&ovs_dp_vport_multicast_group), + PTR_ERR(notify)); return; } - genlmsg_multicast_netns(ovs_dp_get_net(dp), notify, 0, - ovs_dp_vport_multicast_group.id, + genlmsg_multicast_netns(&dp_vport_genl_family, + ovs_dp_get_net(dp), notify, 0, + GROUP_ID(&ovs_dp_vport_multicast_group), GFP_KERNEL); } @@ -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); } } @@ -79,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)) @@ -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); }