[ovs-dev] [PATCH] netdev-dpdk: Fix dpdk_watchdog failure to quiesce.
Daniele Di Proietto
diproiettod at vmware.com
Sat Feb 6 03:17:45 UTC 2016
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" <kevin.traynor at intel.com> 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 <patrik.r.andersson at ericsson.com>
>Signed-off-by: Patrik Andersson R <patrik.r.andersson at ericsson.com>
>Signed-off-by: Kevin Traynor <kevin.traynor at intel.com>
>---
> 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
>dev at openvswitch.org
>http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list