From: Mathieu Desnoyers Date: Sat, 1 Mar 2014 21:22:52 +0000 (-0500) Subject: Fix: move wait loop increment before first conditional block X-Git-Tag: v0.9.0~100 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=5e81fed7cc48d0e14b7478ec1152c3ca2bd01f97;p=urcu.git 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 --- 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) {