diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2008-07-04 02:28:35 +0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2008-07-04 11:22:15 +0400 |
commit | 50952026036c7b4212b90091bf23a264c0ccc1fb (patch) | |
tree | 50c5865ab0fdc8d4f36a69ddcc86037489a90fa9 | |
parent | bf9127c36341573dc47a9c2fc003dcf13bbbf246 (diff) | |
download | linux-50952026036c7b4212b90091bf23a264c0ccc1fb.tar.xz |
[MIPS] Fix bug in atomic_sub_if_positive.
The branch optimization fixes in 2.6.21 introduced a bug in
atomic_sub_if_positive that causes it to return even when the sc
instruction fails. The result is that e.g. down_trylock becomes unreliable
as the semaphore counter is not always decremented.
Original MUA-shredded patch from Morten Larsen <mlarsen@broadcom.com>.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r-- | include/asm-mips/atomic.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/asm-mips/atomic.h b/include/asm-mips/atomic.h index a798d6299a79..1232be3885b0 100644 --- a/include/asm-mips/atomic.h +++ b/include/asm-mips/atomic.h @@ -283,10 +283,10 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v) " beqz %0, 2f \n" " subu %0, %1, %3 \n" " .set reorder \n" - "1: \n" " .subsection 2 \n" "2: b 1b \n" " .previous \n" + "1: \n" " .set mips0 \n" : "=&r" (result), "=&r" (temp), "=m" (v->counter) : "Ir" (i), "m" (v->counter) @@ -664,10 +664,10 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v) " beqz %0, 2f \n" " dsubu %0, %1, %3 \n" " .set reorder \n" - "1: \n" " .subsection 2 \n" "2: b 1b \n" " .previous \n" + "1: \n" " .set mips0 \n" : "=&r" (result), "=&r" (temp), "=m" (v->counter) : "Ir" (i), "m" (v->counter) |