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.
Previous patch was garbled by Outlook - this one should be clean:
--- 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)