diff options
Diffstat (limited to 'arch/arm64/include/asm/futex.h')
| -rw-r--r-- | arch/arm64/include/asm/futex.h | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/arm64/include/asm/futex.h b/arch/arm64/include/asm/futex.h index c582fa31636..5f750dc96e0 100644 --- a/arch/arm64/include/asm/futex.h +++ b/arch/arm64/include/asm/futex.h @@ -24,12 +24,14 @@  #define __futex_atomic_op(insn, ret, oldval, uaddr, tmp, oparg)		\  	asm volatile(							\ -"1:	ldaxr	%w1, %2\n"						\ +"1:	ldxr	%w1, %2\n"						\  	insn "\n"							\  "2:	stlxr	%w3, %w0, %2\n"						\  "	cbnz	%w3, 1b\n"						\ +"	dmb	ish\n"							\  "3:\n"									\  "	.pushsection .fixup,\"ax\"\n"					\ +"	.align	2\n"							\  "4:	mov	%w0, %w5\n"						\  "	b	3b\n"							\  "	.popsection\n"							\ @@ -39,7 +41,7 @@  "	.popsection\n"							\  	: "=&r" (ret), "=&r" (oldval), "+Q" (*uaddr), "=&r" (tmp)	\  	: "r" (oparg), "Ir" (-EFAULT)					\ -	: "cc", "memory") +	: "memory")  static inline int  futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) @@ -110,11 +112,12 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  		return -EFAULT;  	asm volatile("// futex_atomic_cmpxchg_inatomic\n" -"1:	ldaxr	%w1, %2\n" +"1:	ldxr	%w1, %2\n"  "	sub	%w3, %w1, %w4\n"  "	cbnz	%w3, 3f\n"  "2:	stlxr	%w3, %w5, %2\n"  "	cbnz	%w3, 1b\n" +"	dmb	ish\n"  "3:\n"  "	.pushsection .fixup,\"ax\"\n"  "4:	mov	%w0, %w6\n" @@ -126,7 +129,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  "	.popsection\n"  	: "+r" (ret), "=&r" (val), "+Q" (*uaddr), "=&r" (tmp)  	: "r" (oldval), "r" (newval), "Ir" (-EFAULT) -	: "cc", "memory"); +	: "memory");  	*uval = val;  	return ret;  | 
