Update urcu and urcu-qsbr, make compiler barriers explicit
[urcu.git] / urcu.c
diff --git a/urcu.c b/urcu.c
index a3ceca3f5263be7812288f4e909eed6878246980..c6d7dbc9d83a011a7b7d2885f93460a268da6ea2 100644 (file)
--- a/urcu.c
+++ b/urcu.c
@@ -208,13 +208,15 @@ 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();
 
        /*
+        *
         * 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.
@@ -233,7 +235,7 @@ void update_counter_and_wait(void)
                }
 
                list_for_each_entry_safe(index, tmp, &registry, head) {
-                       if (!rcu_old_gp_ongoing(&index->ctr))
+                       if (!rcu_gp_ongoing(&index->ctr))
                                list_move(&index->head, &qsreaders);
                }
 
@@ -302,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
@@ -346,7 +349,7 @@ void rcu_register_thread(void)
 {
        rcu_reader.tid = pthread_self();
        assert(rcu_reader.need_mb == 0);
-       assert(rcu_reader.ctr == 0);
+       assert(!(rcu_reader.ctr & RCU_GP_CTR_NEST_MASK));
 
        mutex_lock(&rcu_gp_lock);
        rcu_init();     /* In case gcc does not support constructor attribute */
This page took 0.024024 seconds and 4 git commands to generate.