summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2005-11-16 15:05:11 +0000
committerRussell King <rmk+kernel@arm.linux.org.uk>2005-11-16 15:05:11 +0000
commita7d068336197945dc4af65c5973c996e526d51cb (patch)
treecbe903bef21fce0d5923cc83071b7b66d00d94c4 /include
parent224b5be6ddc12fa7587433878866cd39e7b935f5 (diff)
downloadop-kernel-dev-a7d068336197945dc4af65c5973c996e526d51cb.zip
op-kernel-dev-a7d068336197945dc4af65c5973c996e526d51cb.tar.gz
[ARM] 3165/1: fix atomic_cmpxchg() implementation for ARMv6+
Patch from Nicolas Pitre If 'old' and 'oldval' are different then 'res' never gets set. In that case, if ever %0 happened to contain anything but zero (rather likely) then the code will loop forever (or until another CPU just come along and change the atomic value to match 'old' which is rather unlikely). Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'include')
-rw-r--r--include/asm-arm/atomic.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/asm-arm/atomic.h b/include/asm-arm/atomic.h
index 75b8027..5f82750 100644
--- a/include/asm-arm/atomic.h
+++ b/include/asm-arm/atomic.h
@@ -87,6 +87,7 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
do {
__asm__ __volatile__("@ atomic_cmpxchg\n"
"ldrex %1, [%2]\n"
+ "mov %0, #0\n"
"teq %1, %3\n"
"strexeq %0, %4, [%2]\n"
: "=&r" (res), "=&r" (oldval)
OpenPOWER on IntegriCloud