[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