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