[ovs-dev] [PATCH v2 1/3] lib/seq: Document acquire-release semantics.

Jarno Rajahalme jrajahalme at nicira.com
Fri Aug 29 21:10:42 UTC 2014


Seq objects would be really hard to use if they did not provide
acquire-release semantics.  Currently they do that via
ovs_mutex_lock()/ovs_mutex_unlock(), respectively.  Document the
behavior so that it is safer to rely on that elsewhere.

Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
---
 lib/ovs-thread.c |    8 +++++++-
 lib/seq.h        |    6 +++++-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/lib/ovs-thread.c b/lib/ovs-thread.c
index efbd60f..6d352ea 100644
--- a/lib/ovs-thread.c
+++ b/lib/ovs-thread.c
@@ -278,7 +278,11 @@ ovs_barrier_destroy(struct ovs_barrier *barrier)
 }
 
 /* Makes the calling thread block on the 'barrier' until all
- * 'barrier->size' threads hit the barrier. */
+ * 'barrier->size' threads hit the barrier.
+ * ovs_barrier provides the necessary acquire-release semantics to make
+ * the effects of prior memory accesses of all the participating threads
+ * visible on return and to prevent the following memory accesses to be
+ * reordered before the ovs_barrier_block(). */
 void
 ovs_barrier_block(struct ovs_barrier *barrier)
 {
@@ -288,6 +292,8 @@ ovs_barrier_block(struct ovs_barrier *barrier)
     atomic_add(&barrier->count, 1, &orig);
     if (orig + 1 == barrier->size) {
         atomic_store(&barrier->count, 0);
+        /* seq_change() serves as a release barrier against the other threads,
+         * so the zeroed count is visible to them as they continue. */
         seq_change(barrier->seq);
     }
 
diff --git a/lib/seq.h b/lib/seq.h
index 38c0e52..31097ff 100644
--- a/lib/seq.h
+++ b/lib/seq.h
@@ -107,7 +107,11 @@
  * Thread-safety
  * =============
  *
- * Fully thread safe.
+ * Fully thread safe.  seq_read() and seq_wait() synchronize with
+ * seq_change() on the same variable in acquire-release fashion.  That
+ * is, all effects of the memory accesses performed by a thread prior
+ * to seq_change() are visible to the threads returning from
+ * seq_read() or seq_wait() observing that change.
  */
 
 #include <stdint.h>
-- 
1.7.10.4




More information about the dev mailing list