mirror of https://gitee.com/openkylin/linux.git
x86: replace LOCK_PREFIX in futex.h
The exception fixup for the futex macros __futex_atomic_op1/2 and futex_atomic_cmpxchg_inatomic() is missing an entry when the lock prefix is replaced by a NOP via SMP alternatives. Chuck Ebert tracked this down from the information provided in: https://bugzilla.redhat.com/show_bug.cgi?id=429412 A possible solution would be to add another fixup after the LOCK_PREFIX, so both the LOCK and NOP case have their own entry in the exception table, but it's not really worth the trouble. Simply replace LOCK_PREFIX with lock and keep those untouched by SMP alternatives. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
5df7fa1c62
commit
9d55b9923a
|
@ -30,7 +30,7 @@
|
|||
"1: movl %2, %0\n \
|
||||
movl %0, %3\n" \
|
||||
insn "\n" \
|
||||
"2: " LOCK_PREFIX "cmpxchgl %3, %2\n \
|
||||
"2: lock; cmpxchgl %3, %2\n \
|
||||
jnz 1b\n \
|
||||
3: .section .fixup,\"ax\"\n \
|
||||
4: mov %5, %1\n \
|
||||
|
@ -72,7 +72,7 @@ futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
|
|||
__futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg);
|
||||
break;
|
||||
case FUTEX_OP_ADD:
|
||||
__futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval,
|
||||
__futex_atomic_op1("lock; xaddl %0, %2", ret, oldval,
|
||||
uaddr, oparg);
|
||||
break;
|
||||
case FUTEX_OP_OR:
|
||||
|
@ -111,8 +111,8 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
|
|||
return -EFAULT;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"1: " LOCK_PREFIX "cmpxchgl %3, %1 \n"
|
||||
|
||||
"1: lock; cmpxchgl %3, %1 \n"
|
||||
"2: .section .fixup, \"ax\" \n"
|
||||
"3: mov %2, %0 \n"
|
||||
" jmp 2b \n"
|
||||
|
|
Loading…
Reference in New Issue