Patrik, thanks for debugging this issue, I've added you to AUTHORS. Thanks for the patch Kevin, I updated a comment (below) and pushed this up to branch-2.4.
On 05/02/2016 09:07, "Kevin Traynor" <[email protected]> wrote: >Fix issue whereby vhost_thread is waiting for dpdk_watchdog >thread to quiesce and at the same time dpdk_watchdog thread >is waiting for vhost_thread to give up dpdk_mutex. > >Reported-by: Patrik Andersson R <[email protected]> >Signed-off-by: Patrik Andersson R <[email protected]> >Signed-off-by: Kevin Traynor <[email protected]> >--- > lib/netdev-dpdk.c | 35 ++++++++++++++++++++++------------- > 1 files changed, 22 insertions(+), 13 deletions(-) > >diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c >index 2a479e2..9b3a241 100644 >--- a/lib/netdev-dpdk.c >+++ b/lib/netdev-dpdk.c >@@ -1904,6 +1904,7 @@ static void > destroy_device(volatile struct virtio_net *dev) > { > struct netdev_dpdk *vhost_dev; >+ bool exists = false; > > ovs_mutex_lock(&dpdk_mutex); > LIST_FOR_EACH (vhost_dev, list_node, &dpdk_list) { >@@ -1912,24 +1913,32 @@ destroy_device(volatile struct virtio_net *dev) > ovs_mutex_lock(&vhost_dev->mutex); > dev->flags &= ~VIRTIO_DEV_RUNNING; > ovsrcu_set(&vhost_dev->virtio_dev, NULL); >+ exists = true; > ovs_mutex_unlock(&vhost_dev->mutex); >- >- /* >- * Wait for other threads to quiesce before >- * setting the virtio_dev to NULL. I think this should be * Wait for other threads to quiesce after setting the 'virtio_dev' * to NULL, before returning. >- */ >- ovsrcu_synchronize(); >- /* >- * As call to ovsrcu_synchronize() will end the quiescent >state, >- * put thread back into quiescent state before returning. >- */ >- ovsrcu_quiesce_start(); >+ break; > } > } >+ > ovs_mutex_unlock(&dpdk_mutex); > >- VLOG_INFO("vHost Device '%s' %"PRIu64" has been removed", >dev->ifname, >- dev->device_fh); >+ if (exists == true) { >+ /* >+ * Wait for other threads to quiesce before >+ * setting the virtio_dev to NULL. >+ */ >+ ovsrcu_synchronize(); >+ /* >+ * As call to ovsrcu_synchronize() will end the quiescent state, >+ * put thread back into quiescent state before returning. >+ */ >+ ovsrcu_quiesce_start(); >+ VLOG_INFO("vHost Device '%s' %"PRIu64" has been removed", >dev->ifname, >+ dev->device_fh); >+ } else { >+ VLOG_INFO("vHost Device '%s' %"PRIu64" not found", dev->ifname, >+ dev->device_fh); >+ } >+ > } > > struct virtio_net * >-- >1.7.4.1 > >_______________________________________________ >dev mailing list >[email protected] >http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
