From bc49c323c92d6809e534fd0bb78309922c1cd2bb Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 18 Sep 2009 09:12:35 -0400 Subject: [PATCH] qsbr: Add write+read thread support to 32-bit QSBR Signed-off-by: Mathieu Desnoyers --- urcu-qsbr.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/urcu-qsbr.c b/urcu-qsbr.c index a86f6e9..3b9a054 100644 --- a/urcu-qsbr.c +++ b/urcu-qsbr.c @@ -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) */ -- 2.34.1