the second smp_mb_master() in synchronize_rcu() seems a little overkill,
but this patch adds code for reader side.

Signed-off-by: Lai Jiangshan <[email protected]>
---
 urcu.c             |    4 ++++
 urcu/static/urcu.h |    4 ++++
 2 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/urcu.c b/urcu.c
index c8164a0..e6b0518 100644
--- a/urcu.c
+++ b/urcu.c
@@ -479,7 +479,11 @@ void synchronize_rcu(void)
        }
 
        /* ensure rcu_read_unlock() finish when we found the ctr==0 */
+#ifndef STRICT
+       cmm_smp_mb(); /* ensure rcu_read_unlock() finish */
+#else
        smp_mb_master(RCU_MB_GROUP); /* ensure rcu_read_unlock() finish */
+#endif
 
 out:
        mutex_unlock(&rcu_gp_lock);
diff --git a/urcu/static/urcu.h b/urcu/static/urcu.h
index e4463a3..aacf6b4 100644
--- a/urcu/static/urcu.h
+++ b/urcu/static/urcu.h
@@ -345,6 +345,10 @@ static inline void _rcu_read_unlock(void)
 
        if (tmp == 1) {
                smp_mb_slave(RCU_MB_GROUP);
+#ifndef STRICT
+               if (unlikely(_CMM_LOAD_SHARED(rcu_reader.sync)))
+                       cmm_smp_mb();
+#endif
 
                rcu_reader.ctr = 0;
                smp_mb_slave(RCU_MB_GROUP);
-- 
1.7.4.4


_______________________________________________
ltt-dev mailing list
[email protected]
http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev

Reply via email to