From 72d24c88ee075c8368fe57ee7e8fc66d99ce7e39 Mon Sep 17 00:00:00 2001 From: Olivier Dion Date: Wed, 29 Mar 2023 14:43:15 -0400 Subject: [PATCH] urcu/arch/generic: Use atomic builtins if configured If configured to use atomic builtins, implement SMP memory barriers in term of atomic builtins if the architecture does not implement its own version. Change-Id: Iddc4283606e0fce572e104d2d3f03b5c0d9926fb Co-authored-by: Mathieu Desnoyers Signed-off-by: Olivier Dion Signed-off-by: Mathieu Desnoyers --- include/urcu/arch/generic.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/include/urcu/arch/generic.h b/include/urcu/arch/generic.h index c02a6a9..f9e115f 100644 --- a/include/urcu/arch/generic.h +++ b/include/urcu/arch/generic.h @@ -31,6 +31,28 @@ extern "C" { * GCC builtins) as well as cmm_rmb and cmm_wmb (defaulting to cmm_mb). */ +#ifdef CONFIG_RCU_USE_ATOMIC_BUILTINS + +# ifndef cmm_smp_mb +# define cmm_smp_mb() __atomic_thread_fence(__ATOMIC_SEQ_CST) +# endif + +#endif /* CONFIG_RCU_USE_ATOMIC_BUILTINS */ + + +/* + * cmm_mb() expands to __sync_synchronize() instead of __atomic_thread_fence + * with SEQ_CST because the former "issues a full memory barrier" while the + * latter "acts as a synchronization fence between threads" which is too weak + * for what we want, for example with I/O devices. + * + * Even though sync_synchronize seems to be an alias for a sequential consistent + * atomic thread fence on every architecture on GCC and Clang, this assumption + * might be untrue in future. Therefore, the definitions above are used to + * ensure correct behavior in the future. + * + * The above defintions are quoted from the GCC manual. + */ #ifndef cmm_mb #define cmm_mb() __sync_synchronize() #endif -- 2.34.1