openvswitch: Simplify datapath locking.
[deliverable/linux.git] / net / openvswitch / vport-netdev.c
index 2130d61c384a227e0d7f5093e285054497e8fb40..40a89ae8e19fd8556d4c51ac635bf029eddb634b 100644 (file)
@@ -100,16 +100,20 @@ 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);
        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:
@@ -131,9 +135,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);
 }
This page took 0.025356 seconds and 5 git commands to generate.