36 lines
1.1 KiB
Diff
36 lines
1.1 KiB
Diff
From: Morten Larsen <mlarsen@broadcom.com>
|
|
|
|
As far as I can tell 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.
|
|
|
|
|
|
--- a/include/asm-mips/atomic.h 2008-06-25 22:38:43.159739000 -0700
|
|
+++ b/include/asm-mips/atomic.h 2008-06-25 22:39:07.552065000 -0700
|
|
@@ -292,10 +292,10 @@ static __inline__ int atomic_sub_if_posi
|
|
" 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)
|
|
@@ -682,10 +682,10 @@ static __inline__ long atomic64_sub_if_p
|
|
" 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)
|
|
|