From e8043c1b4278ffaa886393b2ba601c08ae649e69 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sun, 26 Apr 2009 19:13:58 -0400 Subject: [PATCH] Remove unneeded signal in the cache-coherent case the "reader kick" signal is only needed to perform a smp_mc() on readers, which is pointless in a cache-coherent arch. Signed-off-by: Mathieu Desnoyers --- urcu.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/urcu.c b/urcu.c index 38abf7d..40514c3 100644 --- a/urcu.c +++ b/urcu.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "urcu.h" @@ -99,17 +100,19 @@ static void switch_next_urcu_qparity(void) } #ifdef DEBUG_FULL_MB +#ifdef HAS_INCOHERENT_CACHES static void force_mb_single_thread(struct reader_registry *index) { smp_mb(); } +#endif /* #ifdef HAS_INCOHERENT_CACHES */ static void force_mb_all_threads(void) { smp_mb(); } -#else - +#else /* #ifdef DEBUG_FULL_MB */ +#ifdef HAS_INCOHERENT_CACHES static void force_mb_single_thread(struct reader_registry *index) { assert(registry); @@ -132,6 +135,7 @@ static void force_mb_single_thread(struct reader_registry *index) } smp_mb(); /* read ->need_mb before ending the barrier */ } +#endif /* #ifdef HAS_INCOHERENT_CACHES */ static void force_mb_all_threads(void) { @@ -174,7 +178,7 @@ static void force_mb_all_threads(void) } smp_mb(); /* read ->need_mb before ending the barrier */ } -#endif +#endif /* #else #ifdef DEBUG_FULL_MB */ void wait_for_quiescent_state(void) { @@ -186,6 +190,10 @@ void wait_for_quiescent_state(void) * Wait for each thread urcu_active_readers count to become 0. */ for (index = registry; index < registry + num_readers; index++) { +#ifndef HAS_INCOHERENT_CACHES + while (rcu_old_gp_ongoing(index->urcu_active_readers)) + cpu_relax(); +#else /* #ifndef HAS_INCOHERENT_CACHES */ int wait_loops = 0; /* * BUSY-LOOP. Force the reader thread to commit its @@ -199,6 +207,7 @@ void wait_for_quiescent_state(void) cpu_relax(); } } +#endif /* #else #ifndef HAS_INCOHERENT_CACHES */ } } @@ -360,4 +369,4 @@ void __attribute__((destructor)) urcu_exit(void) assert(act.sa_sigaction == sigurcu_handler); free(registry); } -#endif +#endif /* #ifndef DEBUG_FULL_MB */ -- 2.34.1