diff options
author | Nicolas Pitre <nico@cam.org> | 2005-11-16 15:05:11 +0000 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2005-11-16 15:05:11 +0000 |
commit | a7d068336197945dc4af65c5973c996e526d51cb (patch) | |
tree | cbe903bef21fce0d5923cc83071b7b66d00d94c4 /include/asm-arm | |
parent | 224b5be6ddc12fa7587433878866cd39e7b935f5 (diff) | |
download | kernel_samsung_smdk4412-a7d068336197945dc4af65c5973c996e526d51cb.zip kernel_samsung_smdk4412-a7d068336197945dc4af65c5973c996e526d51cb.tar.gz kernel_samsung_smdk4412-a7d068336197945dc4af65c5973c996e526d51cb.tar.bz2 |
[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/asm-arm')
-rw-r--r-- | include/asm-arm/atomic.h | 1 |
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) |