[lttng-dev] [PATCH] urcu: avoid false sharing for rcu_gp_ctr

Lai Jiangshan eag0628 at gmail.com
Thu May 9 11:00:54 EDT 2013


On Thu, May 9, 2013 at 8:27 PM, Mathieu Desnoyers
<mathieu.desnoyers at efficios.com> wrote:
> * 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)
> +

I think this code can be moved into urcu.c

>  /*
>   * 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