ovs_refcount_unref() needs to syncronize with the other instances of itself rather than with ovs_refcount_ref().
Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- lib/ovs-atomic.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/ovs-atomic.h b/lib/ovs-atomic.h index 8e83411..9dd4d67 100644 --- a/lib/ovs-atomic.h +++ b/lib/ovs-atomic.h @@ -414,7 +414,10 @@ ovs_refcount_ref(struct ovs_refcount *refcount) * } * * Provides a release barrier making the preceding loads and stores to not be - * reordered after the unref. */ + * reordered after the unref, and in case of the last reference provides also + * an acquire barrier to keep all the following uninitialization from being + * reordered before the atomic decrement operation. Together these synchronize + * any concurrent unref operations between each other. */ static inline unsigned int ovs_refcount_unref(struct ovs_refcount *refcount) { @@ -425,8 +428,7 @@ ovs_refcount_unref(struct ovs_refcount *refcount) ovs_assert(old_refcount > 0); if (old_refcount == 1) { /* 'memory_order_release' above means that there are no (reordered) - * accesses to the protected object from any other thread at this - * point. + * accesses to the protected object from any thread at this point. * An acquire barrier is needed to keep all subsequent access to the * object's memory from being reordered before the atomic operation * above. */ -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev