| To: | Thomas Koeller <thomas.koeller@baslerweb.com> |
|---|---|
| Subject: | Re: [PATCH] atomic functions broken |
| From: | Ralf Baechle <ralf@linux-mips.org> |
| Date: | Thu, 23 Feb 2006 14:09:47 +0000 |
| Cc: | linux-mips@linux-mips.org |
| In-reply-to: | <200602222125.39999.thomas.koeller@baslerweb.com> |
| Original-recipient: | rfc822;linux-mips@linux-mips.org |
| References: | <200602222125.39999.thomas.koeller@baslerweb.com> |
| Sender: | linux-mips-bounce@linux-mips.org |
| User-agent: | Mutt/1.4.2.1i |
On Wed, Feb 22, 2006 at 09:25:39PM +0100, Thomas Koeller wrote:
> The ll/sc versions of atomic_sub_if_positive(), and the corresponding 64-bit
> functions,
> are broken. The value returned by those functions is always one, no matter
> what.
Good catch - and I wonder how you found this bug since it didn't seem to
cause any obvious damage. I just went for a different fix though - I was
able to get away without an extra register and squeeze the needed extra
instruction into a delay slot, so no code size penalty either.
Ralf
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
--- a/include/asm-mips/atomic.h
+++ b/include/asm-mips/atomic.h
@@ -250,7 +250,10 @@ static __inline__ int atomic_sub_if_posi
" subu %0, %1, %3 \n"
" bltz %0, 1f \n"
" sc %0, %2 \n"
+ " .set noreorder \n"
" beqzl %0, 1b \n"
+ " subu %0, %1, %3 \n"
+ " .set reorder \n"
" sync \n"
"1: \n"
" .set mips0 \n"
@@ -266,7 +269,10 @@ static __inline__ int atomic_sub_if_posi
" subu %0, %1, %3 \n"
" bltz %0, 1f \n"
" sc %0, %2 \n"
+ " .set noreorder \n"
" beqz %0, 1b \n"
+ " subu %0, %1, %3 \n"
+ " .set reorder \n"
" sync \n"
"1: \n"
" .set mips0 \n"
@@ -598,7 +604,10 @@ static __inline__ long atomic64_sub_if_p
" dsubu %0, %1, %3 \n"
" bltz %0, 1f \n"
" scd %0, %2 \n"
+ " .set noreorder \n"
" beqzl %0, 1b \n"
+ " dsubu %0, %1, %3 \n"
+ " .set reorder \n"
" sync \n"
"1: \n"
" .set mips0 \n"
@@ -614,7 +623,10 @@ static __inline__ long atomic64_sub_if_p
" dsubu %0, %1, %3 \n"
" bltz %0, 1f \n"
" scd %0, %2 \n"
+ " .set noreorder \n"
" beqz %0, 1b \n"
+ " dsubu %0, %1, %3 \n"
+ " .set reorder \n"
" sync \n"
"1: \n"
" .set mips0 \n"
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| ||
| Previous by Date: | Programmed ide transfer size, kernel coder |
|---|---|
| Next by Date: | Re: [PATCH] use generic compat routines for readdir, getdents, Ralf Baechle |
| Previous by Thread: | [PATCH] atomic functions broken, Thomas Koeller |
| Next by Thread: | SERIAL_TXX9 && BROKEN, Geoff Levand |
| Indexes: | [Date] [Thread] [Top] [All Lists] |