I haven't looked at the code yet, but one restriction on
ovsrcu_synchronize() is that the current thread can't have active
pointers to any RCU-protected data (they can get freed).  Is that safe
here?

On Thu, Mar 19, 2015 at 01:43:54PM -0700, Jarno Rajahalme wrote:
> Acked-by: Jarno Rajahalme <jrajaha...@nicira.com>
> 
> Ben may also want to have a look, as commits 98de6bebb (dpif-netdev: Fix 
> another use-after-free in port_unref().) and 87400a3d4cc4a (dpif-netdev: Fix 
> use-after-free in port_unref().) by him have fixed earlier problems related 
> to this. I did not check the changes in these earlier patches, but it is 
> possible that ovsrcu_synchronize() is a more general solution to this 
> problem, as this makes the port lookups essentially RCU-protected. Maybe we 
> should document this fact in some comments?
> 
>   Jarno
> 
> > On Mar 19, 2015, at 9:44 AM, Daniele Di Proietto <diproiet...@vmware.com> 
> > wrote:
> > 
> > port_unref() shouldn't immediately free the port and close the netdev,
> > because otherwise threads that still have a pointer to the port would
> > crash.
> > 
> > This commit fixes the problem by introducing an ovsrcu_synchronize()
> > call in port_unref().
> > 
> > I chose not to use ovsrcu_postpone(), because postponing the removal of
> > the 'netdev' would cause other issues, such as not being possible to
> > reuse the same name for another netdev.
> > 
> > Found the crash while developing new code.
> > 
> > Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com>
> > ---
> > lib/dpif-netdev.c | 2 ++
> > 1 file changed, 2 insertions(+)
> > 
> > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> > index f01fecb..2546e5e 100644
> > --- a/lib/dpif-netdev.c
> > +++ b/lib/dpif-netdev.c
> > @@ -994,6 +994,8 @@ port_unref(struct dp_netdev_port *port)
> >         int n_rxq = netdev_n_rxq(port->netdev);
> >         int i;
> > 
> > +        ovsrcu_synchronize();
> > +
> >         netdev_close(port->netdev);
> >         netdev_restore_flags(port->sf);
> > 
> > -- 
> > 2.1.4
> > 
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to