diff options
| author | Vineet Gupta <vgupta@synopsys.com> | 2015-08-06 09:41:06 -0400 |
|---|---|---|
| committer | Vineet Gupta <vgupta@synopsys.com> | 2015-08-20 08:46:01 -0400 |
| commit | eb2cd8b72b08fe56998600aee8a5dff93f7be5a2 (patch) | |
| tree | f16645c5a57ce9221e2c6ced11b73789ea9d242c | |
| parent | 5e0574292ad48dcdf48ef90a47da862c21d649a6 (diff) | |
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>
| -rw-r--r-- | arch/arc/include/asm/futex.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/arc/include/asm/futex.h b/arch/arc/include/asm/futex.h index 0ea8bcc7b846..8f449982523b 100644 --- a/arch/arc/include/asm/futex.h +++ b/arch/arc/include/asm/futex.h | |||
| @@ -87,6 +87,9 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) | |||
| 87 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | 87 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) |
| 88 | return -EFAULT; | 88 | return -EFAULT; |
| 89 | 89 | ||
| 90 | #ifndef CONFIG_ARC_HAS_LLSC | ||
| 91 | preempt_disable(); /* to guarantee atomic r-m-w of futex op */ | ||
| 92 | #endif | ||
| 90 | pagefault_disable(); | 93 | pagefault_disable(); |
| 91 | 94 | ||
| 92 | switch (op) { | 95 | switch (op) { |
| @@ -111,6 +114,9 @@ static inline int futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) | |||
| 111 | } | 114 | } |
| 112 | 115 | ||
| 113 | pagefault_enable(); | 116 | pagefault_enable(); |
| 117 | #ifndef CONFIG_ARC_HAS_LLSC | ||
| 118 | preempt_enable(); | ||
| 119 | #endif | ||
| 114 | 120 | ||
| 115 | if (!ret) { | 121 | if (!ret) { |
| 116 | switch (cmp) { | 122 | switch (cmp) { |
| @@ -153,6 +159,9 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 expval, | |||
| 153 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) | 159 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32))) |
| 154 | return -EFAULT; | 160 | return -EFAULT; |
| 155 | 161 | ||
| 162 | #ifndef CONFIG_ARC_HAS_LLSC | ||
| 163 | preempt_disable(); /* to guarantee atomic r-m-w of futex op */ | ||
| 164 | #endif | ||
| 156 | smp_mb(); | 165 | smp_mb(); |
| 157 | 166 | ||
| 158 | __asm__ __volatile__( | 167 | __asm__ __volatile__( |
| @@ -182,6 +191,9 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 expval, | |||
| 182 | 191 | ||
| 183 | smp_mb(); | 192 | smp_mb(); |
| 184 | 193 | ||
| 194 | #ifndef CONFIG_ARC_HAS_LLSC | ||
| 195 | preempt_enable(); | ||
| 196 | #endif | ||
| 185 | *uval = existval; | 197 | *uval = existval; |
| 186 | return ret; | 198 | return ret; |
| 187 | } | 199 | } |
