ARC: ensure futex ops are atomic in !LLSC config
W/o hardware assisted atomic r-m-w the best we can do is to disable preemption. Cc: David Hildenbrand <dahi@linux.vnet.ibm.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Michel Lespinasse <walken@google.com> Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
5e0574292a
commit
eb2cd8b72b
|
@ -87,6 +87,9 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)
|
||||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
#ifndef CONFIG_ARC_HAS_LLSC
|
||||||
|
preempt_disable(); /* to guarantee atomic r-m-w of futex op */
|
||||||
|
#endif
|
||||||
pagefault_disable();
|
pagefault_disable();
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
|
@ -111,6 +114,9 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
pagefault_enable();
|
pagefault_enable();
|
||||||
|
#ifndef CONFIG_ARC_HAS_LLSC
|
||||||
|
preempt_enable();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
switch (cmp) {
|
switch (cmp) {
|
||||||
|
@ -153,6 +159,9 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 expval,
|
||||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
|
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
#ifndef CONFIG_ARC_HAS_LLSC
|
||||||
|
preempt_disable(); /* to guarantee atomic r-m-w of futex op */
|
||||||
|
#endif
|
||||||
smp_mb();
|
smp_mb();
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
|
@ -182,6 +191,9 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 expval,
|
||||||
|
|
||||||
smp_mb();
|
smp_mb();
|
||||||
|
|
||||||
|
#ifndef CONFIG_ARC_HAS_LLSC
|
||||||
|
preempt_enable();
|
||||||
|
#endif
|
||||||
*uval = existval;
|
*uval = existval;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue