From 5e81fed7cc48d0e14b7478ec1152c3ca2bd01f97 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sat, 1 Mar 2014 16:22:52 -0500 Subject: [PATCH] Fix: move wait loop increment before first conditional block The fix "Fix: high cpu usage in synchronize_rcu with long RCU read-side C.S." has an imperfection in urcu.c and urcu-qsbr.c: when incrementing the wait loop counter for the last time, the first conditional branch is not taken, but the following conditionals are, and they assume the first conditional has been taken. Within urcu.c (urcu-mb, urcu-membarrier and urcu-signal), and urcu-qsbr.c, this will simply skip the first wait_gp() call, without any noticeable ill side-effect. Signed-off-by: Mathieu Desnoyers --- urcu-qsbr.c | 4 ++-- urcu.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/urcu-qsbr.c b/urcu-qsbr.c index cd3beff..71e7a39 100644 --- a/urcu-qsbr.c +++ b/urcu-qsbr.c @@ -130,6 +130,8 @@ static void wait_for_readers(struct cds_list_head *input_readers, * current rcu_gp.ctr value. */ for (;;) { + if (wait_loops < RCU_QS_ACTIVE_ATTEMPTS) + wait_loops++; if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) { uatomic_set(&rcu_gp.futex, -1); /* @@ -142,8 +144,6 @@ static void wait_for_readers(struct cds_list_head *input_readers, } /* Write futex before read reader_gp */ cmm_smp_mb(); - } else { - wait_loops++; } cds_list_for_each_entry_safe(index, tmp, input_readers, node) { switch (rcu_reader_state(&index->ctr)) { diff --git a/urcu.c b/urcu.c index d6dec1a..ae3490f 100644 --- a/urcu.c +++ b/urcu.c @@ -242,12 +242,12 @@ static void wait_for_readers(struct cds_list_head *input_readers, * rcu_gp.ctr value. */ for (;;) { + if (wait_loops < RCU_QS_ACTIVE_ATTEMPTS) + wait_loops++; if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) { uatomic_dec(&rcu_gp.futex); /* Write futex before read reader_gp */ smp_mb_master(RCU_MB_GROUP); - } else { - wait_loops++; } cds_list_for_each_entry_safe(index, tmp, input_readers, node) { -- 2.34.1