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. - */ - 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
