| From 59263b513c11398cd66a52d4c5b2b118ce1e0359 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Wed, 15 Feb 2012 12:08:34 +0100 |
| Subject: futex: Cover all PI opcodes with cmpxchg enabled check |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit 59263b513c11398cd66a52d4c5b2b118ce1e0359 upstream. |
| |
| Some of the newer futex PI opcodes do not check the cmpxchg enabled |
| variable and call unconditionally into the handling functions. Cover |
| all PI opcodes in a separate check. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Darren Hart <dvhart@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/futex.c | 19 +++++++++++++------ |
| 1 file changed, 13 insertions(+), 6 deletions(-) |
| |
| --- a/kernel/futex.c |
| +++ b/kernel/futex.c |
| @@ -2641,6 +2641,16 @@ long do_futex(u32 __user *uaddr, int op, |
| } |
| |
| switch (cmd) { |
| + case FUTEX_LOCK_PI: |
| + case FUTEX_UNLOCK_PI: |
| + case FUTEX_TRYLOCK_PI: |
| + case FUTEX_WAIT_REQUEUE_PI: |
| + case FUTEX_CMP_REQUEUE_PI: |
| + if (!futex_cmpxchg_enabled) |
| + return -ENOSYS; |
| + } |
| + |
| + switch (cmd) { |
| case FUTEX_WAIT: |
| val3 = FUTEX_BITSET_MATCH_ANY; |
| case FUTEX_WAIT_BITSET: |
| @@ -2661,16 +2671,13 @@ long do_futex(u32 __user *uaddr, int op, |
| ret = futex_wake_op(uaddr, flags, uaddr2, val, val2, val3); |
| break; |
| case FUTEX_LOCK_PI: |
| - if (futex_cmpxchg_enabled) |
| - ret = futex_lock_pi(uaddr, flags, val, timeout, 0); |
| + ret = futex_lock_pi(uaddr, flags, val, timeout, 0); |
| break; |
| case FUTEX_UNLOCK_PI: |
| - if (futex_cmpxchg_enabled) |
| - ret = futex_unlock_pi(uaddr, flags); |
| + ret = futex_unlock_pi(uaddr, flags); |
| break; |
| case FUTEX_TRYLOCK_PI: |
| - if (futex_cmpxchg_enabled) |
| - ret = futex_lock_pi(uaddr, flags, 0, timeout, 1); |
| + ret = futex_lock_pi(uaddr, flags, 0, timeout, 1); |
| break; |
| case FUTEX_WAIT_REQUEUE_PI: |
| val3 = FUTEX_BITSET_MATCH_ANY; |