On May 27, 2014, at 4:58 PM, Ben Pfaff <b...@nicira.com> wrote:

> On Thu, May 22, 2014 at 05:37:42PM -0700, Jarno Rajahalme wrote:
>> The documentation of the memory order argument of atomic operations
>> states that memory loads after an atomic load with a
>> memory_order_acquire cannot be moved before the atomic operation.
>> This still leaves open the possibility that non-atomic loads before
>> the atomic load could be moved after it, hence breaking down the
>> synchronization used for cmap_find().
>> 
>> This patch fixes this my using atomics (with appropriate memory_order)
>> also for the struct cmap_node pointer and hash values.
>> 
>> struct cmap_node itself is used for the pointer, since it already
>> contains an RCU pointer (which is atomic) for a struct cmap_node.
>> This also helps simplify some of the code previously dealing
>> separately with the cmap_node pointer in the bucket v.s. a cmap_node.
>> 
>> Hash values are also accessed using atomics.  Otherwise it might be
>> legal for a compiler to read the hash values once, and keep using the
>> same values through all the retries.
>> 
>> These should have no effect on performance.
>> 
>> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
> 
> Why is cmap_get_hash__() a macro instead of an inline function?  At
> any rate, we can't use the ({ ... }) GCC extension in code compiled
> everywhere.
> 

Oops, I wondered about the syntax, but did not check where it was defined 
sorry. I defined it as a static function instead.

> I don't really like the look of this:
> +    for (struct cmap_node *iter = &b->nodes[slot];;) {
> Would you mind writing it as this?
> +    struct cmap_node *iter = &b->nodes[slot];
> +    for (;;) {
> 

Done. Mixing declarations and code in action…

> I think this makes the code uglier but it also seems to put the memory
> ordering issues to rest.
> 
> Acked-by: Ben Pfaff <b...@nicira.com>

I’m almost ready to push the series, waiting for your final comment on 4/5.

  Jarno

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

Reply via email to