Update urcu and urcu-qsbr, make compiler barriers explicit
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Wed, 17 Mar 2010 13:31:26 +0000 (09:31 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Wed, 17 Mar 2010 13:31:26 +0000 (09:31 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
urcu-qsbr.c
urcu.c

index c678d38779eb683f1f78872a87e853a4c281f43d..b043b8592e7f04f1606bd3b734b2130e09c260e9 100644 (file)
@@ -121,10 +121,14 @@ static void update_counter_and_wait(void)
 #endif /* !(BITS_PER_LONG < 64) */
 
        /*
-        * Enforce compiler-order of store to rcu_gp_ctr before before
-        * load rcu_reader ctr.
-        * This ensures synchronize_rcu() cannot be starved by readers.
-        *
+        * Must commit rcu_gp_ctr update to memory before waiting for quiescent
+        * state. Failure to do so could result in the writer waiting forever
+        * while new readers are always accessing data (no progress). Enforce
+        * compiler-order of store to rcu_gp_ctr before load rcu_reader ctr.
+        */
+       barrier();
+
+       /*
         * Adding a smp_mb() which is _not_ formally required, but makes the
         * model easier to understand. It does not have a big performance impact
         * anyway, given this is the write-side.
@@ -208,11 +212,12 @@ void synchronize_rcu(void)
 
        /*
         * Must finish waiting for quiescent state for parity 0 before
-        * committing qparity update to memory. Failure to do so could result in
-        * the writer waiting forever while new readers are always accessing
-        * data (no progress).
-        * Ensured by STORE_SHARED and LOAD_SHARED.
+        * committing next rcu_gp_ctr update to memory. Failure to do so could
+        * result in the writer waiting forever while new readers are always
+        * accessing data (no progress).  Enforce compiler-order of load
+        * rcu_reader ctr before store to rcu_gp_ctr.
         */
+       barrier();
 
        /*
         * Adding a smp_mb() which is _not_ formally required, but makes the
diff --git a/urcu.c b/urcu.c
index bb6629c718086a9800a22a4d3ab21685b27c26a5..c6d7dbc9d83a011a7b7d2885f93460a268da6ea2 100644 (file)
--- a/urcu.c
+++ b/urcu.c
@@ -208,16 +208,14 @@ void update_counter_and_wait(void)
        STORE_SHARED(rcu_gp_ctr, rcu_gp_ctr ^ RCU_GP_CTR_PHASE);
 
        /*
-        * Must commit qparity update to memory before waiting for other parity
-        * quiescent state. Failure to do so could result in the writer waiting
-        * forever while new readers are always accessing data (no progress).
-        * Ensured by STORE_SHARED and LOAD_SHARED.
+        * Must commit rcu_gp_ctr update to memory before waiting for quiescent
+        * state. Failure to do so could result in the writer waiting forever
+        * while new readers are always accessing data (no progress). Enforce
+        * compiler-order of store to rcu_gp_ctr before load rcu_reader ctr.
         */
+       barrier();
 
        /*
-        * Enforce compiler-order of store to rcu_gp_ctr before before
-        * load rcu_reader ctr.
-        * This ensures synchronize_rcu() cannot be starved by readers.
         *
         * Adding a smp_mb() which is _not_ formally required, but makes the
         * model easier to understand. It does not have a big performance impact
@@ -306,11 +304,12 @@ void synchronize_rcu(void)
 
        /*
         * Must finish waiting for quiescent state for parity 0 before
-        * committing qparity update to memory. Failure to do so could result in
-        * the writer waiting forever while new readers are always accessing
-        * data (no progress).
-        * Ensured by STORE_SHARED and LOAD_SHARED.
+        * committing next rcu_gp_ctr update to memory. Failure to do so could
+        * result in the writer waiting forever while new readers are always
+        * accessing data (no progress).  Enforce compiler-order of load
+        * rcu_reader ctr before store to rcu_gp_ctr.
         */
+       barrier();
 
        /*
         * Adding a smp_mb() which is _not_ formally required, but makes the
This page took 0.02734 seconds and 4 git commands to generate.