s390/spinlock: optimize spin_unlock code
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Mon, 8 Sep 2014 06:20:43 +0000 (08:20 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 9 Sep 2014 06:53:30 +0000 (08:53 +0200)
commit442302820356977237e32a76a211e7942255003a
treecaf9d4d00753beab556f28f4f4cfac3d7f8b73e9
parent3d1e220d08c6a00ffa83d39030b8162f66665b2b
s390/spinlock: optimize spin_unlock code

Use a memory barrier + store sequence instead of a load + compare and swap
sequence to unlock a spinlock and an rw lock.
For the spinlock case this saves us two memory reads and a not needed cpu
serialization after the compare and swap instruction stored the new value.

The kernel size (performance_defconfig) gets reduced by ~14k.

Average execution time of a tight inlined spin_unlock loop drops from
5.8ns to 0.7ns on a zEC12 machine.

An artificial stress test case where several counters are protected with
a single spinlock and which are only incremented while holding the spinlock
shows ~30% improvement on a 4 cpu machine.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/barrier.h
arch/s390/include/asm/spinlock.h