use smp_*mb()
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Thu, 12 Feb 2009 04:47:15 +0000 (23:47 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Thu, 12 Feb 2009 04:47:15 +0000 (23:47 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
urcu.c
urcu.h

diff --git a/urcu.c b/urcu.c
index 9542b264a6dbf53d36d2fb63e7578b4e7ff2b2f5..162ce00fa2d4c5516ef6093722d4dfc7b17cda23 100644 (file)
--- a/urcu.c
+++ b/urcu.c
@@ -43,7 +43,9 @@ unsigned int __thread rand_yield;
 
 static struct reader_data *reader_data;
 static int num_readers, alloc_readers;
+#ifndef DEBUG_FULL_MB
 static int sig_done;
+#endif
 
 void internal_urcu_lock(void)
 {
@@ -77,14 +79,14 @@ static void switch_next_urcu_qparity(void)
 #ifdef DEBUG_FULL_MB
 static void force_mb_all_threads(void)
 {
-       mb();
+       smp_mb();
 }
 #else
 static void force_mb_all_threads(void)
 {
        struct reader_data *index;
        /*
-        * Ask for each threads to execute a mb() so we can consider the
+        * Ask for each threads to execute a smp_mb() so we can consider the
         * compiler barriers around rcu read lock as real memory barriers.
         */
        if (!reader_data)
@@ -92,7 +94,7 @@ static void force_mb_all_threads(void)
        debug_yield_write();
        sig_done = 0;
        debug_yield_write();
-       mb();   /* write sig_done before sending the signals */
+       smp_mb();       /* write sig_done before sending the signals */
        debug_yield_write();
        for (index = reader_data; index < reader_data + num_readers; index++) {
                pthread_kill(index->tid, SIGURCU);
@@ -105,7 +107,7 @@ static void force_mb_all_threads(void)
        while (sig_done < num_readers)
                barrier();
        debug_yield_write();
-       mb();   /* read sig_done before ending the barrier */
+       smp_mb();       /* read sig_done before ending the barrier */
        debug_yield_write();
 }
 #endif
@@ -147,7 +149,7 @@ void synchronize_rcu(void)
         * waiting forever while new readers are always accessing data (no
         * progress).
         */
-       mb();
+       smp_mb();
 
        /*
         * Wait for previous parity to be empty of readers.
@@ -161,7 +163,7 @@ void synchronize_rcu(void)
         * the writer waiting forever while new readers are always accessing
         * data (no progress).
         */
-       mb();
+       smp_mb();
 
        switch_next_urcu_qparity();     /* 1 -> 0 */
        debug_yield_write();
@@ -172,7 +174,7 @@ void synchronize_rcu(void)
         * waiting forever while new readers are always accessing data (no
         * progress).
         */
-       mb();
+       smp_mb();
 
        /*
         * Wait for previous parity to be empty of readers.
@@ -256,7 +258,7 @@ void urcu_unregister_thread(void)
 #ifndef DEBUG_FULL_MB
 void sigurcu_handler(int signo, siginfo_t *siginfo, void *context)
 {
-       mb();
+       smp_mb();
        atomic_inc(&sig_done);
 }
 
diff --git a/urcu.h b/urcu.h
index c4a7992b4b7b166d527411d4ae5108cac174fc95..92b31df603d157ffa942534af1d5731d912c2342 100644 (file)
--- a/urcu.h
+++ b/urcu.h
 #define rmb()   asm volatile("lfence":::"memory")
 #define wmb()   asm volatile("sfence" ::: "memory")
 
+/* Assume SMP machine, given we don't have this information */
+#define CONFIG_SMP 1
+
+#ifdef CONFIG_SMP
+#define smp_mb()       mb()
+#define smp_rmb()      rmb()
+#define smp_wmb()      wmb()
+#else
+#define smp_mb()       barrier()
+#define smp_rmb()      barrier()
+#define smp_wmb()      barrier()
+#endif
+
 static inline void atomic_inc(int *v)
 {
        asm volatile("lock; incl %0"
@@ -173,7 +186,7 @@ static inline void debug_yield_init(void)
 #ifdef DEBUG_FULL_MB
 static inline void read_barrier()
 {
-       mb();
+       smp_mb();
 }
 #else
 static inline void read_barrier()
This page took 0.033538 seconds and 4 git commands to generate.