[lttng-dev] [PATCH] urcu: avoid false sharing for rcu_gp_ctr
Lai Jiangshan
laijs at cn.fujitsu.com
Wed May 15 21:58:34 EDT 2013
On 05/09/2013 11:10 PM, Mathieu Desnoyers wrote:
> * Lai Jiangshan (eag0628 at gmail.com) wrote:
> [...]
>> I think this code can be moved into urcu.c
>
> good point! How about this ?
Hi, I don't see any obvious bad thing, but I can't carefully check it
currently, It seems OK for me.
Could you make it some progress.
Thanks,
Lai
>
> ---
> 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 <syscall.h>
> +#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 <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..53d2610 100644
> --- a/urcu/static/urcu.h
> +++ b/urcu/static/urcu.h
> @@ -52,30 +52,6 @@ extern "C" {
> #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
> -
> -/*
> * 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
> * be only linked with the Userspace RCU library. This comes with a small
>
More information about the lttng-dev
mailing list