From ea818ea8340c13742a4f41e6077f732291aea4bc Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 25 Aug 2014 15:43:40 -0400 Subject: [PATCH] add working a_spin() atomic for non-x86 targets conceptually, a_spin needs to be at least a compiler barrier, so the compiler will not optimize out loops (and the load on each iteration) while spinning. it should also be a memory barrier, or the spinning thread might keep spinning without noticing stores from other threads, thus delaying for longer than it should. ideally, an optimal a_spin implementation that avoids unnecessary cache/memory contention should be chosen for each arch, but for now, the easiest thing is to perform a useless a_cas on the calling thread's stack. --- arch/arm/atomic.h | 1 + arch/microblaze/atomic.h | 1 + arch/mips/atomic.h | 1 + arch/or1k/atomic.h | 1 + arch/powerpc/atomic.h | 1 + arch/sh/atomic.h | 1 + 6 files changed, 6 insertions(+) diff --git a/arch/arm/atomic.h b/arch/arm/atomic.h index 302e6d8f..52103542 100644 --- a/arch/arm/atomic.h +++ b/arch/arm/atomic.h @@ -103,6 +103,7 @@ static inline void a_store(volatile int *p, int x) static inline void a_spin() { + __k_cas(&(int){0}, 0, 0)); } static inline void a_crash() diff --git a/arch/microblaze/atomic.h b/arch/microblaze/atomic.h index 96265fe6..abb79b53 100644 --- a/arch/microblaze/atomic.h +++ b/arch/microblaze/atomic.h @@ -97,6 +97,7 @@ static inline void a_store(volatile int *p, int x) static inline void a_spin() { + a_cas(&(int){0}, 0, 0); } static inline void a_crash() diff --git a/arch/mips/atomic.h b/arch/mips/atomic.h index 3ec03586..cc5bf498 100644 --- a/arch/mips/atomic.h +++ b/arch/mips/atomic.h @@ -137,6 +137,7 @@ static inline void a_store(volatile int *p, int x) static inline void a_spin() { + a_cas(&(int){0}, 0, 0); } static inline void a_crash() diff --git a/arch/or1k/atomic.h b/arch/or1k/atomic.h index 5b0411b0..f9e69815 100644 --- a/arch/or1k/atomic.h +++ b/arch/or1k/atomic.h @@ -74,6 +74,7 @@ static inline void a_store(volatile int *p, int x) static inline void a_spin() { + a_cas(&(int){0}, 0, 0); } static inline void a_crash() diff --git a/arch/powerpc/atomic.h b/arch/powerpc/atomic.h index 1044886d..1c50361e 100644 --- a/arch/powerpc/atomic.h +++ b/arch/powerpc/atomic.h @@ -80,6 +80,7 @@ static inline void a_store(volatile int *p, int x) static inline void a_spin() { + a_cas(&(int){0}, 0, 0); } static inline void a_crash() diff --git a/arch/sh/atomic.h b/arch/sh/atomic.h index 93ab54fe..b95bbffc 100644 --- a/arch/sh/atomic.h +++ b/arch/sh/atomic.h @@ -53,6 +53,7 @@ static inline void a_dec(volatile int *x) static inline void a_spin() { + a_cas(&(int){0}, 0, 0); } static inline void a_crash()