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
