[lttng-dev] [PATCH] urcu: avoid false sharing for rcu_gp_ctr
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Thu May 9 08:27:48 EDT 2013
* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
[...]
> How about we also define membarrier(...) which just returns -ENOSYS
> when the system don't have SYS_membarrier?
Indeed, this vastly simplifies the patch:
Thoughts ?
---
diff --git a/urcu.c b/urcu.c
index b3f94da..763b40c 100644
--- a/urcu.c
+++ b/urcu.c
@@ -139,7 +139,7 @@ static void mutex_unlock(pthread_mutex_t *mutex)
static void smp_mb_master(int group)
{
if (caa_likely(rcu_has_sys_membarrier))
- membarrier(MEMBARRIER_EXPEDITED);
+ (void) membarrier(MEMBARRIER_EXPEDITED);
else
cmm_smp_mb();
}
diff --git a/urcu/map/urcu.h b/urcu/map/urcu.h
index 217bff5..77b3721 100644
--- a/urcu/map/urcu.h
+++ b/urcu/map/urcu.h
@@ -38,31 +38,6 @@
#define RCU_MEMBARRIER
#endif
-/*
- * RCU_MEMBARRIER is only possibly available on Linux. Fallback to
- * RCU_MB
- * otherwise.
- */
-#if !defined(__linux__) && defined(RCU_MEMBARRIER)
-#undef RCU_MEMBARRIER
-#define RCU_MB
-#endif
-
-#ifdef RCU_MEMBARRIER
-#include <syscall.h>
-
-/* If the headers do not support SYS_membarrier, statically use RCU_MB */
-#ifdef SYS_membarrier
-# define MEMBARRIER_EXPEDITED (1 << 0)
-# define MEMBARRIER_DELAYED (1 << 1)
-# define MEMBARRIER_QUERY (1 << 16)
-# define membarrier(...) syscall(SYS_membarrier, __VA_ARGS__)
-#else
-# undef RCU_MEMBARRIER
-# define RCU_MB
-#endif
-#endif
-
#ifdef RCU_MEMBARRIER
#define rcu_read_lock rcu_read_lock_memb
diff --git a/urcu/static/urcu.h b/urcu/static/urcu.h
index bee97ee..0b03a50 100644
--- a/urcu/static/urcu.h
+++ b/urcu/static/urcu.h
@@ -33,6 +33,7 @@
#include <pthread.h>
#include <unistd.h>
#include <stdint.h>
+#include <error.h>
#include <urcu/compiler.h>
#include <urcu/arch.h>
@@ -52,29 +53,23 @@ extern "C" {
#endif
/*
- * RCU_MEMBARRIER is only possibly available on Linux. Fallback to RCU_MB
- * otherwise.
+ * RCU_MEMBARRIER is only possibly available on Linux.
*/
-#if !defined(__linux__) && defined(RCU_MEMBARRIER)
-#undef RCU_MEMBARRIER
-#define RCU_MB
-#endif
-
-#ifdef RCU_MEMBARRIER
+#if defined(RCU_MEMBARRIER) && defined(__linux__)
#include <syscall.h>
+#endif
-/* If the headers do not support SYS_membarrier, statically use RCU_MB */
+/* If the headers do not support SYS_membarrier, fall back on RCU_MB */
#ifdef SYS_membarrier
-# define MEMBARRIER_EXPEDITED (1 << 0)
-# define MEMBARRIER_DELAYED (1 << 1)
-# define MEMBARRIER_QUERY (1 << 16)
# define membarrier(...) syscall(SYS_membarrier, __VA_ARGS__)
#else
-# undef RCU_MEMBARRIER
-# define RCU_MB
-#endif
+# define membarrier(...) -ENOSYS
#endif
+#define MEMBARRIER_EXPEDITED (1 << 0)
+#define MEMBARRIER_DELAYED (1 << 1)
+#define MEMBARRIER_QUERY (1 << 16)
+
/*
* This code section can only be included in LGPL 2.1 compatible source code.
* See below for the function call wrappers which can be used in code meant to
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list