Thanks for reporting this! I think we should allow the illusion that ovsrcu_init is a function, and it’s parameters are evaluated before the body. Otherwise problems like this are bound to be reintroduced. I’ll post a patch soon.
Jarno On Jun 2, 2014, at 3:34 AM, YAMAMOTO Takashi <yamam...@valinux.co.jp> wrote: > In the case of ovs-atomic-pthreads, the previous coding is expanded > into successive atomic_lock__ calls which ends up with deadlock. > > Signed-off-by: YAMAMOTO Takashi <yamam...@valinux.co.jp> > --- > lib/cmap.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/lib/cmap.c b/lib/cmap.c > index a760235..7892d50 100644 > --- a/lib/cmap.c > +++ b/lib/cmap.c > @@ -690,7 +690,9 @@ cmap_replace__(struct cmap_impl *impl, struct cmap_node > *node, > replacement = cmap_node_next_protected(node); > } else { > /* 'replacement' takes the position of 'node' in the list. */ > - ovsrcu_init(&replacement->next, cmap_node_next_protected(node)); > + struct cmap_node *next = cmap_node_next_protected(node); > + > + ovsrcu_init(&replacement->next, next); > } > > struct cmap_node *iter = &b->nodes[slot]; > -- > 1.8.3.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev