arm64: xchg: Implement cmpxchg_double
authorSteve Capper <steve.capper@linaro.org>
Fri, 24 Oct 2014 12:22:20 +0000 (13:22 +0100)
committerWill Deacon <will.deacon@arm.com>
Thu, 6 Nov 2014 17:25:28 +0000 (17:25 +0000)
commit5284e1b4bc8ae6fcc1c92c63cf6c876a53292f82
tree3aeddebd2c9ebbb59bf7e6eec64796c97c5c5c2c
parent70ddb63a88bfd45eb6abe36e2bf4f8f351a447d7
arm64: xchg: Implement cmpxchg_double

The arm64 architecture has the ability to exclusively load and store
a pair of registers from an address (ldxp/stxp). Also the SLUB can take
advantage of a cmpxchg_double implementation to avoid taking some
locks.

This patch provides an implementation of cmpxchg_double for 64-bit
pairs, and activates the logic required for the SLUB to use these
functions (HAVE_ALIGNED_STRUCT_PAGE and HAVE_CMPXCHG_DOUBLE).

Also definitions of this_cpu_cmpxchg_8 and this_cpu_cmpxchg_double_8
are wired up to cmpxchg_local and cmpxchg_double_local (rather than the
stock implementations that perform non-atomic operations with
interrupts disabled) as they are used by the SLUB.

On a Juno platform running on only the A57s I get quite a noticeable
performance improvement with 5 runs of hackbench on v3.17:

         Baseline | With Patch
 -----------------+-----------
 Mean    119.2312 | 106.1782
 StdDev    0.4919 |   0.4494

(times taken to complete `./hackbench 100 process 1000', in seconds)

Signed-off-by: Steve Capper <steve.capper@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/Kconfig
arch/arm64/include/asm/cmpxchg.h