Commit 1f8675481e (ofproto-dpif-upcall: Fix ovs-vswitchd crash.)
directly copied the udpif_set_threads() logic to udpif_stop_threads()
and udpif_start_threads().  In fact, this was erroneous and caused
unittest failures.

This commit fixes the above issue by correcting the checks in
udpif_stop_threads() and udpif_start_threads(), and adding necessary
checks in udpif_set_threads().

Signed-off-by: Alex Wang <al...@nicira.com>
---
 ofproto/ofproto-dpif-upcall.c |   17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
index 8e43e84..f8c0301 100644
--- a/ofproto/ofproto-dpif-upcall.c
+++ b/ofproto/ofproto-dpif-upcall.c
@@ -296,9 +296,8 @@ udpif_destroy(struct udpif *udpif)
 static void
 udpif_stop_threads(struct udpif *udpif)
 {
-    if (udpif->handlers &&
-        (udpif->n_handlers != n_handlers
-         || udpif->n_revalidators != n_revalidators)) {
+    if (udpif->handlers
+        && (udpif->n_handlers != 0 || udpif->n_revalidators != 0)) {
         size_t i;
 
         latch_set(&udpif->exit_latch);
@@ -360,7 +359,7 @@ static void
 udpif_start_threads(struct udpif *udpif, size_t n_handlers,
                     size_t n_revalidators)
 {
-    if (!udpif->handlers && n_handlers) {
+    if (!udpif->handlers && !udpif->revalidators) {
         size_t i;
 
         udpif->n_handlers = n_handlers;
@@ -406,7 +405,11 @@ udpif_set_threads(struct udpif *udpif, size_t n_handlers,
     ovs_assert(n_handlers && n_revalidators);
 
     ovsrcu_quiesce_start();
-    udpif_stop_threads(udpif);
+    if (udpif->handlers &&
+        (udpif->n_handlers != n_handlers
+         || udpif->n_revalidators != n_revalidators)) {
+        udpif_stop_threads(udpif);
+    }
 
     error = dpif_handlers_set(udpif->dpif, n_handlers);
     if (error) {
@@ -415,7 +418,9 @@ udpif_set_threads(struct udpif *udpif, size_t n_handlers,
         return;
     }
 
-    udpif_start_threads(udpif, n_handlers, n_revalidators);
+    if (!udpif->handlers && n_handlers) {
+        udpif_start_threads(udpif, n_handlers, n_revalidators);
+    }
     ovsrcu_quiesce_end();
 }
 
-- 
1.7.9.5

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to