creation and deletion.
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().
Acked-by: Ethan Jackson <ethan@nicira.com>
Signed-off-by: Alex Wang <alexw@nicira.com>
static void
udpif_stop_threads(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 && (udpif->n_handlers != 0 || udpif->n_revalidators != 0)) {
size_t i;
latch_set(&udpif->exit_latch);
size_t i;
latch_set(&udpif->exit_latch);
udpif_start_threads(struct udpif *udpif, size_t n_handlers,
size_t n_revalidators)
{
udpif_start_threads(struct udpif *udpif, size_t n_handlers,
size_t n_revalidators)
{
- if (!udpif->handlers && n_handlers) {
+ if (udpif && (!udpif->handlers && !udpif->revalidators)) {
size_t i;
udpif->n_handlers = n_handlers;
size_t i;
udpif->n_handlers = n_handlers;
ovs_assert(n_handlers && n_revalidators);
ovsrcu_quiesce_start();
ovs_assert(n_handlers && n_revalidators);
ovsrcu_quiesce_start();
- udpif_stop_threads(udpif);
+ if (udpif->n_handlers != n_handlers
+ || udpif->n_revalidators != n_revalidators) {
+ udpif_stop_threads(udpif);
+ }
error = dpif_handlers_set(udpif->dpif, n_handlers);
if (error) {
error = dpif_handlers_set(udpif->dpif, n_handlers);
if (error) {
- udpif_start_threads(udpif, n_handlers, n_revalidators);
+ if (!udpif->handlers && !udpif->revalidators) {
+ udpif_start_threads(udpif, n_handlers, n_revalidators);
+ }