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

Reply via email to