locking, mips: Fix atomics
authorPeter Zijlstra <peterz@infradead.org>
Tue, 2 Sep 2014 20:21:26 +0000 (22:21 +0200)
committerIngo Molnar <mingo@kernel.org>
Wed, 10 Sep 2014 09:45:06 +0000 (11:45 +0200)
The patch folding the atomic ops had two silly fails in the _return
primitives.

Fixes: ef31563e950c ("locking,arch,mips: Fold atomic_ops")
Reported-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Bart Van Assche <bvanassche@acm.org>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Maciej W. Rozycki <macro@codesourcery.com>
Cc: Markos Chandras <markos.chandras@imgtec.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Link: http://lkml.kernel.org/r/20140902202126.GA3190@worktop.ger.corp.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/mips/include/asm/atomic.h

index 476fe3b5dfc621e84b5e93332d8911ed7661367d..f3ee721fe61d9f9ed8987ec59b8843ac752496c2 100644 (file)
@@ -93,7 +93,7 @@ static __inline__ int atomic_##op##_return(int i, atomic_t * v)                       \
                "       " #asm_op " %0, %1, %3                          \n"     \
                "       sc      %0, %2                                  \n"     \
                "       beqzl   %0, 1b                                  \n"     \
-               "       addu    %0, %1, %3                              \n"     \
+               "       " #asm_op " %0, %1, %3                          \n"     \
                "       .set    mips0                                   \n"     \
                : "=&r" (result), "=&r" (temp), "+m" (v->counter)               \
                : "Ir" (i));                                                    \
@@ -111,7 +111,7 @@ static __inline__ int atomic_##op##_return(int i, atomic_t * v)                     \
                        : "Ir" (i));                                            \
                } while (unlikely(!result));                                    \
                                                                                \
-               result = temp + i;                                              \
+               result = temp; result c_op i;                                   \
        } else {                                                                \
                unsigned long flags;                                            \
                                                                                \
@@ -387,7 +387,7 @@ static __inline__ long atomic64_##op##_return(long i, atomic64_t * v)               \
                        : "memory");                                            \
                } while (unlikely(!result));                                    \
                                                                                \
-               result = temp + i;                                              \
+               result = temp; result c_op i;                                   \
        } else {                                                                \
                unsigned long flags;                                            \
                                                                                \