From da06fe948c0878057e5f563ebd3dfe40c0f1b0d2 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 6 Mar 2015 13:20:44 +0100 Subject: [PATCH] score: Fix SMP lock implementation See also: https://nahratzah.wordpress.com/2012/10/12/a-trivial-fair-spinlock/ http://concurrencyfreaks.blogspot.de/2014/05/relaxed-atomics-optimizations-for.html --- cpukit/score/include/rtems/score/atomic.h | 2 ++ cpukit/score/include/rtems/score/cpustdatomic.h | 6 ++++++ cpukit/score/include/rtems/score/smplock.h | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cpukit/score/include/rtems/score/atomic.h b/cpukit/score/include/rtems/score/atomic.h index cb09c95156..0cf3e990c0 100644 --- a/cpukit/score/include/rtems/score/atomic.h +++ b/cpukit/score/include/rtems/score/atomic.h @@ -50,6 +50,8 @@ typedef CPU_atomic_Order Atomic_Order; #define ATOMIC_ORDER_RELEASE CPU_ATOMIC_ORDER_RELEASE +#define ATOMIC_ORDER_ACQ_REL CPU_ATOMIC_ORDER_ACQ_REL + #define ATOMIC_ORDER_SEQ_CST CPU_ATOMIC_ORDER_SEQ_CST #define ATOMIC_INITIALIZER_UINT( value ) CPU_ATOMIC_INITIALIZER_UINT( value ) diff --git a/cpukit/score/include/rtems/score/cpustdatomic.h b/cpukit/score/include/rtems/score/cpustdatomic.h index 3f7c14f320..d27c75f381 100644 --- a/cpukit/score/include/rtems/score/cpustdatomic.h +++ b/cpukit/score/include/rtems/score/cpustdatomic.h @@ -56,6 +56,8 @@ typedef std::memory_order CPU_atomic_Order; #define CPU_ATOMIC_ORDER_RELEASE std::memory_order_release +#define CPU_ATOMIC_ORDER_ACQ_REL std::memory_order_acq_rel + #define CPU_ATOMIC_ORDER_SEQ_CST std::memory_order_seq_cst #define CPU_ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value ) @@ -85,6 +87,8 @@ typedef memory_order CPU_atomic_Order; #define CPU_ATOMIC_ORDER_RELEASE memory_order_release +#define CPU_ATOMIC_ORDER_ACQ_REL memory_order_acq_rel + #define CPU_ATOMIC_ORDER_SEQ_CST memory_order_seq_cst #define CPU_ATOMIC_INITIALIZER_UINT( value ) ATOMIC_VAR_INIT( value ) @@ -114,6 +118,8 @@ typedef int CPU_atomic_Order; #define CPU_ATOMIC_ORDER_RELEASE 3 +#define CPU_ATOMIC_ORDER_ACQ_REL 4 + #define CPU_ATOMIC_ORDER_SEQ_CST 5 #define CPU_ATOMIC_INITIALIZER_UINT( value ) ( value ) diff --git a/cpukit/score/include/rtems/score/smplock.h b/cpukit/score/include/rtems/score/smplock.h index cc54c694df..364a722828 100644 --- a/cpukit/score/include/rtems/score/smplock.h +++ b/cpukit/score/include/rtems/score/smplock.h @@ -280,7 +280,7 @@ static inline void _SMP_ticket_lock_Acquire( #endif my_ticket = - _Atomic_Fetch_add_uint( &lock->next_ticket, 1U, ATOMIC_ORDER_RELAXED ); + _Atomic_Fetch_add_uint( &lock->next_ticket, 1U, ATOMIC_ORDER_ACQ_REL ); #if defined( RTEMS_PROFILING ) now_serving =