[ARM] 3165/1: fix atomic_cmpxchg() implementation for ARMv6+
authorNicolas Pitre <nico@cam.org>
Wed, 16 Nov 2005 15:05:11 +0000 (15:05 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 16 Nov 2005 15:05:11 +0000 (15:05 +0000)
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>
include/asm-arm/atomic.h

index 75b802719723ad459d719b6f598254fe0dfe02e4..5f827509e923aa2e62b1d4b14fdfca691d7fd107 100644 (file)
@@ -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)