datapath: Simplify datapath locking.
[sliver-openvswitch.git] / datapath / vport-netdev.c
index 727194e..f8948fa 100644 (file)
@@ -152,19 +152,23 @@ static struct vport *netdev_create(const struct vport_parms *parms)
                goto error_put;
        }
 
+       rtnl_lock();
        err = netdev_rx_handler_register(netdev_vport->dev, netdev_frame_hook,
                                         vport);
        if (err)
-               goto error_put;
+               goto error_unlock;
 
        dev_set_promiscuity(netdev_vport->dev, 1);
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
        dev_disable_lro(netdev_vport->dev);
 #endif
        netdev_vport->dev->priv_flags |= IFF_OVS_DATAPATH;
+       rtnl_unlock();
 
        return vport;
 
+error_unlock:
+       rtnl_unlock();
 error_put:
        dev_put(netdev_vport->dev);
 error_free_vport:
@@ -186,9 +190,11 @@ static void netdev_destroy(struct vport *vport)
 {
        struct netdev_vport *netdev_vport = netdev_vport_priv(vport);
 
+       rtnl_lock();
        netdev_vport->dev->priv_flags &= ~IFF_OVS_DATAPATH;
        netdev_rx_handler_unregister(netdev_vport->dev);
        dev_set_promiscuity(netdev_vport->dev, -1);
+       rtnl_unlock();
 
        call_rcu(&netdev_vport->rcu, free_port_rcu);
 }