Ilya Maximets <[email protected]> writes: > vports are used concurrently and protected by RCU, so netdev_put() > must happen after the RCU grace period. So, either in an RCU call or > after the synchronize_net(). The rtnl_delete_link() must happen under > RTNL and so can't be executed in RCU context. Calling synchronize_net() > while holding RTNL is not a good idea for performance and system > stability under load in general, so calling netdev_put() in RCU call > is the right solution here. > > However, > when the device is deleted, rtnl_unlock() will call netdev_run_todo() > and block until all the references are gone. In the current code this > means that we never reach the call_rcu() and the vport is never freed > and the reference is never released, causing a self-deadlock on device > removal. > > Fix that by moving the rcu_call() before the rtnl_unlock(), so the > scheduled RCU callback will be executed when synchronize_net() is > called from the rtnl_unlock()->netdev_run_todo() while the RTNL itself > is already released. > > Fixes: 6931d21f87bc ("openvswitch: defer tunnel netdev_put to RCU release") > Cc: [email protected] > Acked-by: Eelco Chaudron <[email protected]> > Signed-off-by: Ilya Maximets <[email protected]> > ---
Acked-by: Aaron Conole <[email protected]> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
