[ovs-dev] [PATCH] dpif-netdev: Make datapath port mutex recursive.
Stokes, Ian
ian.stokes at intel.com
Thu Jan 16 12:13:06 UTC 2020
On 1/15/2020 5:29 PM, Ilya Maximets wrote:
> Upcoming HW offloading will request flow statistics from the dpdk
> offloading module. This operation requires holding datapath port
> mutex. However, there is a possible scenarion in which flow deletion
> happens during datapath reconfiguration process and the mutex already
> acquired:
>
> 0 raise () from /lib64/libc.so.6
> 1 abort () from /lib64/libc.so.6
> 2 ovs_abort_valist ()
> 3 ovs_abort ()
> 4 ovs_mutex_lock_at ()
> 5 dpif_netdev_get_flow_offload_status ()
> 6 get_dpif_flow_status ()
> 7 flow_del_on_pmd ()
> 8 dpif_netdev_flow_del ()
> 9 dpif_netdev_operate ()
> 10 dpif_operate ()
> 11 push_dp_ops ()
> 12 push_ukey_ops ()
> 13 dp_purge_cb ()
> 14 dp_netdev_del_pmd ()
> 15 reconfigure_pmd_threads ()
> 16 reconfigure_datapath ()
> 17 do_del_port ()
> 18 dpif_netdev_port_del ()
> 19 dpif_port_del ()
> 20 port_del ()
> 21 ofproto_port_del ()
> 22 bridge_delete_or_reconfigure_ports ()
> 23 bridge_reconfigure ()
> 24 bridge_run ()
> 25 main ()
>
> This happens while removing the last port of a particular PMD thread.
> Reconfiguration process decides that we need to remove current PMD
> thread and calls datapath purge callback in order to clean up resources
> assigned to it. This turns into flow removal and flow_del() tries to
> request statistics.
>
> Turning the dp->mutex into recursive version as a quick fix for this
> issue. Better solutions might be to avoid statistics request somehow,
> or fully disassociate offloaded flows from the datapath flows.
>
> Signed-off-by: Ilya Maximets <i.maximets at ovn.org>
Thanks for the patch Ilya, makes snse to me as a workaround for the
moment. Tested in my own deployment and didnt see any issues.
Acked.
Ian
> ---
>
> Ideas for better solution are welcome.
>
> lib/dpif-netdev.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 079bd1bdf..d4b1ebbff 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -1547,7 +1547,7 @@ create_dp_netdev(const char *name, const struct dpif_class *class,
> ovs_refcount_init(&dp->ref_cnt);
> atomic_flag_clear(&dp->destroyed);
>
> - ovs_mutex_init(&dp->port_mutex);
> + ovs_mutex_init_recursive(&dp->port_mutex);
> hmap_init(&dp->ports);
> dp->port_seq = seq_create();
> fat_rwlock_init(&dp->upcall_rwlock);
>
More information about the dev
mailing list