qsbr: Add write+read thread support to 32-bit QSBR
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Fri, 18 Sep 2009 13:12:35 +0000 (09:12 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Fri, 18 Sep 2009 13:12:35 +0000 (09:12 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
urcu-qsbr.c

index a86f6e94d5ae13eb24e5d34610a3d9c5954373b4..3b9a054b40b1bc61f29768bf5d4085d62a8b7bd9 100644 (file)
@@ -135,12 +135,24 @@ static void switch_next_urcu_qparity(void)
 
 void synchronize_rcu(void)
 {
+       unsigned long was_online;
+
+       was_online = rcu_reader_qs_gp;
+
        /* All threads should read qparity before accessing data structure
         * where new ptr points to.
         */
        /* Write new ptr before changing the qparity */
        smp_mb();
 
+       /*
+        * Mark the writer thread offline to make sure we don't wait for
+        * our own quiescent state. This allows using synchronize_rcu() in
+        * threads registered as readers.
+        */
+       if (was_online)
+               STORE_SHARED(rcu_reader_qs_gp, 0);
+
        internal_urcu_lock();
 
        switch_next_urcu_qparity();     /* 0 -> 1 */
@@ -183,9 +195,12 @@ void synchronize_rcu(void)
 
        internal_urcu_unlock();
 
-       /* Finish waiting for reader threads before letting the old ptr being
+       /*
+        * Finish waiting for reader threads before letting the old ptr being
         * freed.
         */
+       if (was_online)
+               _STORE_SHARED(rcu_reader_qs_gp, LOAD_SHARED(urcu_gp_ctr));
        smp_mb();
 }
 #else /* !(BITS_PER_LONG < 64) */
This page took 0.025203 seconds and 4 git commands to generate.