2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00

ofproto-dpif: Do not block on uninitialized pause barriers.

e4e74c3a "dpif-netdev: Purge all ukeys when reconfigure pmd." introduced a new
dp_purge_cb function, which calls udpif_pause_revalidators() and that tries to
block on pause_barrier.
But if OVS was started with flow-restore-wait="true" (e.g. through ovs-ctl),
type_run() will have backer->recv_set_enable == false, and udpif_set_threads
won't initialize the barrier, which leads to a segfault like this:

This patch introduces ofproto_dpif_backer_enabled(), which checks
recv_set_enable before touching the latch and blocking on pause_barrier.

Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
Acked-by: Joe Stringer <joestringer@nicira.com>
This commit is contained in:
Zoltan Kiss
2015-09-25 11:42:40 -07:00
committed by Joe Stringer
parent 3a8653d716
commit d997f23fe5
3 changed files with 16 additions and 4 deletions

View File

@@ -522,8 +522,10 @@ udpif_start_threads(struct udpif *udpif, size_t n_handlers,
static void
udpif_pause_revalidators(struct udpif *udpif)
{
latch_set(&udpif->pause_latch);
ovs_barrier_block(&udpif->pause_barrier);
if (ofproto_dpif_backer_enabled(udpif->backer)) {
latch_set(&udpif->pause_latch);
ovs_barrier_block(&udpif->pause_barrier);
}
}
/* Resumes the pausing of revalidators. Should only be called by the
@@ -531,8 +533,10 @@ udpif_pause_revalidators(struct udpif *udpif)
static void
udpif_resume_revalidators(struct udpif *udpif)
{
latch_poll(&udpif->pause_latch);
ovs_barrier_block(&udpif->pause_barrier);
if (ofproto_dpif_backer_enabled(udpif->backer)) {
latch_poll(&udpif->pause_latch);
ovs_barrier_block(&udpif->pause_barrier);
}
}
/* Tells 'udpif' how many threads it should use to handle upcalls.

View File

@@ -515,6 +515,12 @@ lookup_ofproto_dpif_by_port_name(const char *name)
return NULL;
}
bool
ofproto_dpif_backer_enabled(struct dpif_backer* backer)
{
return backer->recv_set_enable;
}
static int
type_run(const char *type)
{

View File

@@ -169,6 +169,8 @@ struct ofport_dpif *odp_port_to_ofport(const struct dpif_backer *, odp_port_t);
struct ofport_dpif *ofp_port_to_ofport(const struct ofproto_dpif *,
ofp_port_t);
bool ofproto_dpif_backer_enabled(struct dpif_backer* backer);
int ofproto_dpif_add_internal_flow(struct ofproto_dpif *,
const struct match *, int priority,
uint16_t idle_timeout,