]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/mips/include/asm/atomic.h
mips/atomic: Fix loongson_llsc_mb() wreckage
[linux.git] / arch / mips / include / asm / atomic.h
index 9a82dd11c0e9ed56ee5363321657513a164529eb..190f1b61512212e72ef357d5013c91e389596a16 100644 (file)
@@ -193,6 +193,7 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)
        if (kernel_uses_llsc) {
                int temp;
 
+               loongson_llsc_mb();
                __asm__ __volatile__(
                "       .set    push                                    \n"
                "       .set    "MIPS_ISA_LEVEL"                        \n"
@@ -200,12 +201,12 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)
                "       .set    pop                                     \n"
                "       subu    %0, %1, %3                              \n"
                "       move    %1, %0                                  \n"
-               "       bltz    %0, 1f                                  \n"
+               "       bltz    %0, 2f                                  \n"
                "       .set    push                                    \n"
                "       .set    "MIPS_ISA_LEVEL"                        \n"
                "       sc      %1, %2                                  \n"
                "\t" __scbeqz " %1, 1b                                  \n"
-               "1:                                                     \n"
+               "2:                                                     \n"
                "       .set    pop                                     \n"
                : "=&r" (result), "=&r" (temp),
                  "+" GCC_OFF_SMALL_ASM() (v->counter)