From 553b7eb9da3a223368abdf3f6a5ead35acf8a20b Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 8 May 2013 09:53:45 -0400 Subject: [PATCH] Fix: membarrier fallback symbol conflict * Lai Jiangshan (laijs@cn.fujitsu.com) wrote: > Hi, Mathieu, > > There is a big compatible problem in URCU which should be fix in next round. > > LB: liburcu built on the system which has sys_membarrier(). > LU: liburcu built on the system which does NOT have sys_membarrier(). > > LBM: liburcu-mb .... > LUM: liburcu-mb ... > > AB: application(-lliburcu) built on the system which has sys_membarrier(). > AU: application(-lliburcu) built on the system which does NOT have > sys_membarrier(). > > ABM application(-lliburcu-mb) ... > AUM application(-lliburcu-mb) ... > > AB/AU + LB/LU: 4 combinations > ABM/AUM + LBM/LUM: 4 combinations > > I remember some of the 8 combinations can't works due to symbols are > miss match. only LU+AB and LB+AU ? > > could you check it? > > How to fix it: In LU and AU, keep all the symbol name/ABI as LA and > AB, but only the behaviors falls back to URCU_MB. Define membarrier() as -ENOSYS when SYS_membarrier is not found in the system headers. Check dynamically for membarrier availability to ensure ABI compatibility between applications and librairies. Reported-by: Lai Jiangshan Signed-off-by: Mathieu Desnoyers --- urcu.c | 20 +++++++++++++++++++- urcu/map/urcu.h | 25 ------------------------- urcu/static/urcu.h | 24 ------------------------ 3 files changed, 19 insertions(+), 50 deletions(-) diff --git a/urcu.c b/urcu.c index b3f94da..1d5c06f 100644 --- a/urcu.c +++ b/urcu.c @@ -62,6 +62,24 @@ */ #define RCU_QS_ACTIVE_ATTEMPTS 100 +/* + * RCU_MEMBARRIER is only possibly available on Linux. + */ +#if defined(RCU_MEMBARRIER) && defined(__linux__) +#include +#endif + +/* If the headers do not support SYS_membarrier, fall back on RCU_MB */ +#ifdef SYS_membarrier +# define membarrier(...) syscall(SYS_membarrier, __VA_ARGS__) +#else +# define membarrier(...) -ENOSYS +#endif + +#define MEMBARRIER_EXPEDITED (1 << 0) +#define MEMBARRIER_DELAYED (1 << 1) +#define MEMBARRIER_QUERY (1 << 16) + #ifdef RCU_MEMBARRIER static int init_done; int rcu_has_sys_membarrier; @@ -139,7 +157,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 - -/* 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..53d2610 100644 --- a/urcu/static/urcu.h +++ b/urcu/static/urcu.h @@ -51,30 +51,6 @@ extern "C" { #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 - -/* 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 - /* * 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 -- 2.34.1