aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm/spinlock_types.h
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2012-07-06 15:43:41 +0100
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-07-09 17:41:10 +0100
commit546c2896a42202dbc7d02f7c6ec9948ac1bf511b (patch)
tree8b83e208144d3c157984946e77ec59d1545d0537 /arch/arm/include/asm/spinlock_types.h
parentARM: 7445/1: mm: update CONTEXTIDR register to contain PID of current process (diff)
downloadlinux-dev-546c2896a42202dbc7d02f7c6ec9948ac1bf511b.tar.xz
linux-dev-546c2896a42202dbc7d02f7c6ec9948ac1bf511b.zip
ARM: 7446/1: spinlock: use ticket algorithm for ARMv6+ locking implementation
Ticket spinlocks ensure locking fairness by introducing a FIFO-like nature to the granting of lock acquisitions and also reducing the thundering herd effect when spinning on a lock by allowing the cacheline to remain in a shared state amongst the waiting CPUs. This is especially important on systems where memory-access times are not necessarily uniform when accessing the lock structure (for example, on a multi-cluster platform where the lock is allocated into L1 when a CPU releases it). This patch implements the ticket spinlock algorithm for ARM, replacing the simpler implementation for ARMv6+ processors. Reviewed-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/include/asm/spinlock_types.h')
-rw-r--r--arch/arm/include/asm/spinlock_types.h17
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/arm/include/asm/spinlock_types.h b/arch/arm/include/asm/spinlock_types.h
index d14d197ae04a..b262d2f8b478 100644
--- a/arch/arm/include/asm/spinlock_types.h
+++ b/arch/arm/include/asm/spinlock_types.h
@@ -5,11 +5,24 @@
# error "please don't include this file directly"
#endif
+#define TICKET_SHIFT 16
+
typedef struct {
- volatile unsigned int lock;
+ union {
+ u32 slock;
+ struct __raw_tickets {
+#ifdef __ARMEB__
+ u16 next;
+ u16 owner;
+#else
+ u16 owner;
+ u16 next;
+#endif
+ } tickets;
+ };
} arch_spinlock_t;
-#define __ARCH_SPIN_LOCK_UNLOCKED { 0 }
+#define __ARCH_SPIN_LOCK_UNLOCKED { { 0 } }
typedef struct {
volatile unsigned int lock;