Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / include / asm-arm / locks.h
index c26298f..852220e 100644 (file)
@@ -28,7 +28,8 @@
 "      blmi    " #fail                         \
        :                                       \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
+       smp_mb();                               \
        })
 
 #define __down_op_ret(ptr,fail)                        \
 "      mov     %0, ip"                         \
        : "=&r" (ret)                           \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
+       smp_mb();                               \
        ret;                                    \
        })
 
 #define __up_op(ptr,wake)                      \
        ({                                      \
+       smp_mb();                               \
        __asm__ __volatile__(                   \
        "@ up_op\n"                             \
 "1:    ldrex   lr, [%0]\n"                     \
 "      strex   ip, lr, [%0]\n"                 \
 "      teq     ip, #0\n"                       \
 "      bne     1b\n"                           \
-"      teq     lr, #0\n"                       \
+"      cmp     lr, #0\n"                       \
 "      movle   ip, %0\n"                       \
 "      blle    " #wake                         \
        :                                       \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
        })
 
 /*
 "      blne    " #fail                         \
        :                                       \
        : "r" (ptr), "I" (RW_LOCK_BIAS)         \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
+       smp_mb();                               \
        })
 
 #define __up_op_write(ptr,wake)                        \
        ({                                      \
+       smp_mb();                               \
        __asm__ __volatile__(                   \
-       "@ up_op_read\n"                        \
+       "@ up_op_write\n"                       \
 "1:    ldrex   lr, [%0]\n"                     \
-"      add     lr, lr, %1\n"                   \
+"      adds    lr, lr, %1\n"                   \
 "      strex   ip, lr, [%0]\n"                 \
 "      teq     ip, #0\n"                       \
 "      bne     1b\n"                           \
 "      blcs    " #wake                         \
        :                                       \
        : "r" (ptr), "I" (RW_LOCK_BIAS)         \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
        })
 
 #define __down_op_read(ptr,fail)               \
 
 #define __up_op_read(ptr,wake)                 \
        ({                                      \
+       smp_mb();                               \
        __asm__ __volatile__(                   \
        "@ up_op_read\n"                        \
 "1:    ldrex   lr, [%0]\n"                     \
 "      bleq    " #wake                         \
        :                                       \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
        })
 
 #else
 "      blmi    " #fail                         \
        :                                       \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
+       smp_mb();                               \
        })
 
 #define __down_op_ret(ptr,fail)                        \
 "      mov     %0, ip"                         \
        : "=&r" (ret)                           \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
+       smp_mb();                               \
        ret;                                    \
        })
 
 #define __up_op(ptr,wake)                      \
        ({                                      \
+       smp_mb();                               \
        __asm__ __volatile__(                   \
        "@ up_op\n"                             \
 "      mrs     ip, cpsr\n"                     \
 "      blle    " #wake                         \
        :                                       \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
        })
 
 /*
 "      blne    " #fail                         \
        :                                       \
        : "r" (ptr), "I" (RW_LOCK_BIAS)         \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
+       smp_mb();                               \
        })
 
 #define __up_op_write(ptr,wake)                        \
        ({                                      \
        __asm__ __volatile__(                   \
-       "@ up_op_read\n"                        \
+       "@ up_op_write\n"                       \
 "      mrs     ip, cpsr\n"                     \
 "      orr     lr, ip, #128\n"                 \
 "      msr     cpsr_c, lr\n"                   \
 "      blcs    " #wake                         \
        :                                       \
        : "r" (ptr), "I" (RW_LOCK_BIAS)         \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
+       smp_mb();                               \
        })
 
 #define __down_op_read(ptr,fail)               \
 
 #define __up_op_read(ptr,wake)                 \
        ({                                      \
+       smp_mb();                               \
        __asm__ __volatile__(                   \
        "@ up_op_read\n"                        \
 "      mrs     ip, cpsr\n"                     \
 "      bleq    " #wake                         \
        :                                       \
        : "r" (ptr), "I" (1)                    \
-       : "ip", "lr", "cc", "memory");          \
+       : "ip", "lr", "cc");                    \
        })
 
 #endif