[lttng-dev] [PATCH] urcu: avoid false sharing for rcu_gp_ctr
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Thu May 16 01:52:20 EDT 2013
* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
> 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. Merged as:
commit 553b7eb9da3a223368abdf3f6a5ead35acf8a20b
Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date: Wed May 8 09:53:45 2013 -0400
Fix: membarrier fallback symbol conflict
Mathieu
>
> 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
> >
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list