> 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)