Commit 54122475 authored by Andrei Vagin's avatar Andrei Vagin Committed by Pavel Emelyanov

arm: fix atomic_{add,sub}_return

Now, this code doesn't pass this simple test:

        atomic_t a;;
        int c = 0;
        atomic_set(&a, c);
        c = atomic_inc(&a);
        if (c != 0) {
                pr_err("c = %x &a = %p\n", c, &a);
                return 1;
        }

08:28:51.771: 26187: ERR: fd.c:36: c = 7ef47a60 &a = 0x7ef47a60

Reported-by: Mr Jenkins
Signed-off-by: 's avatarAndrei Vagin <avagin@gmail.com>
Reviewed-by: 's avatarDmitry Safonov <0x7f454c46@gmail.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@gmail.com>
parent 59930e5a
...@@ -25,8 +25,8 @@ static inline unsigned int atomic_add_return(int i, atomic_t *v) ...@@ -25,8 +25,8 @@ static inline unsigned int atomic_add_return(int i, atomic_t *v)
" strex %1, %0, [%3]\n" " strex %1, %0, [%3]\n"
" teq %1, #0\n" " teq %1, #0\n"
" bne 1b\n" " bne 1b\n"
: "=&r" (result), "=&r" (tmp), "+Qo" (v) : "=&r" (result), "=&r" (tmp), "+Qo" (*v)
: "r" (&v), "Ir" (i) : "r" (v), "Ir" (i)
: "cc"); : "cc");
smp_mb(); smp_mb();
...@@ -47,8 +47,8 @@ static inline unsigned int atomic_sub_return(int i, atomic_t *v) ...@@ -47,8 +47,8 @@ static inline unsigned int atomic_sub_return(int i, atomic_t *v)
" strex %1, %0, [%3]\n" " strex %1, %0, [%3]\n"
" teq %1, #0\n" " teq %1, #0\n"
" bne 1b\n" " bne 1b\n"
: "=&r" (result), "=&r" (tmp), "+Qo" (v) : "=&r" (result), "=&r" (tmp), "+Qo" (*v)
: "r" (&v), "Ir" (i) : "r" (v), "Ir" (i)
: "cc"); : "cc");
smp_mb(); smp_mb();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment