[PATCH 18/22] atomic: Consolidate atomic_full_barrier implementation
Uros Bizjak
ubizjak@gmail.com
Thu Sep 11 15:06:43 GMT 2025
On Thu, Sep 11, 2025 at 3:53 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> All ABIs save for sparcv9 and s390 defines it to __sync_synchronize,
> which can be mapped to __atomic_thread_fence (__ATOMIC_SEQ_CST).
>
> For Sparc, it uses a stricter #StoreStore|#LoadStore|#StoreLoad|#LoadLoad
> instead of the #StoreLoad generated by __sync_synchronize.
>
> For s390x, it defaults to a memory barrier where __sync_synchronize
> emits a 'bcr 15,0' (which the manual describes as pipeline synchronization).
>
> The barrier is used only in one place (pthread_mutex_setprioceiling),
> and using a stricter barrier for s390 is ok performance-wise.
>
> Co-authored-by: Wilco Dijkstra <Wilco.Dijkstra@arm.com>
> ---
> include/atomic.h | 2 +-
> sysdeps/aarch64/atomic-machine.h | 3 ---
> sysdeps/alpha/atomic-machine.h | 1 -
> sysdeps/arc/atomic-machine.h | 2 --
> sysdeps/arm/atomic-machine.h | 2 --
> sysdeps/generic/malloc-machine.h | 4 ----
> sysdeps/hppa/atomic-machine.h | 2 --
> sysdeps/loongarch/atomic-machine.h | 2 --
> sysdeps/mips/atomic-machine.h | 20 --------------------
> sysdeps/mips/sys/asm.h | 16 ----------------
> sysdeps/or1k/atomic-machine.h | 2 --
> sysdeps/powerpc/atomic-machine.h | 2 --
> sysdeps/riscv/atomic-machine.h | 2 --
> sysdeps/x86/atomic-machine.h | 1 -
> 14 files changed, 1 insertion(+), 60 deletions(-)
>
> diff --git a/include/atomic.h b/include/atomic.h
> index a9eb4d740b..9bd2753e32 100644
> --- a/include/atomic.h
> +++ b/include/atomic.h
> @@ -103,7 +103,7 @@
>
>
> #ifndef atomic_full_barrier
> -# define atomic_full_barrier() __asm ("" ::: "memory")
> +# define atomic_full_barrier() __atomic_thread_fence (__ATOMIC_SEQ_CST)
> #endif
Maybe this change should be more like Wilco's change:
+# define atomic_full_barrier() atomic_thread_fence_seq_cst()
to use macros, defined a few lines below. This is also consistent with
how e.g. atomic_compare_and_exchange_val_acq() uses
atomic_compare_exchange_acquire().
Uros.
More information about the Libc-alpha
mailing list