diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-19 20:11:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-19 20:11:15 -0400 |
commit | 5ed59af85077d28875a3a137b21933aaf1b4cd50 (patch) | |
tree | d225d654de47ebe480a59d479ae5b3cc7c90cd71 /kernel/futex.c | |
parent | b7f077d7bc28649f6bd369fadec01219e725a9c6 (diff) | |
parent | 81b40539e748b108d143a5e38526ab00a6a784b6 (diff) |
Merge branch 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull core/locking changes for v3.4 from Ingo Molnar
* 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
futex: Simplify return logic
futex: Cover all PI opcodes with cmpxchg enabled check
Diffstat (limited to 'kernel/futex.c')
-rw-r--r-- | kernel/futex.c | 51 |
1 files changed, 23 insertions, 28 deletions
diff --git a/kernel/futex.c b/kernel/futex.c index 1614be20173d..72efa1e4359a 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -2628,7 +2628,7 @@ void exit_robust_list(struct task_struct *curr) | |||
2628 | long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, | 2628 | long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, |
2629 | u32 __user *uaddr2, u32 val2, u32 val3) | 2629 | u32 __user *uaddr2, u32 val2, u32 val3) |
2630 | { | 2630 | { |
2631 | int ret = -ENOSYS, cmd = op & FUTEX_CMD_MASK; | 2631 | int cmd = op & FUTEX_CMD_MASK; |
2632 | unsigned int flags = 0; | 2632 | unsigned int flags = 0; |
2633 | 2633 | ||
2634 | if (!(op & FUTEX_PRIVATE_FLAG)) | 2634 | if (!(op & FUTEX_PRIVATE_FLAG)) |
@@ -2641,49 +2641,44 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, | |||
2641 | } | 2641 | } |
2642 | 2642 | ||
2643 | switch (cmd) { | 2643 | switch (cmd) { |
2644 | case FUTEX_LOCK_PI: | ||
2645 | case FUTEX_UNLOCK_PI: | ||
2646 | case FUTEX_TRYLOCK_PI: | ||
2647 | case FUTEX_WAIT_REQUEUE_PI: | ||
2648 | case FUTEX_CMP_REQUEUE_PI: | ||
2649 | if (!futex_cmpxchg_enabled) | ||
2650 | return -ENOSYS; | ||
2651 | } | ||
2652 | |||
2653 | switch (cmd) { | ||
2644 | case FUTEX_WAIT: | 2654 | case FUTEX_WAIT: |
2645 | val3 = FUTEX_BITSET_MATCH_ANY; | 2655 | val3 = FUTEX_BITSET_MATCH_ANY; |
2646 | case FUTEX_WAIT_BITSET: | 2656 | case FUTEX_WAIT_BITSET: |
2647 | ret = futex_wait(uaddr, flags, val, timeout, val3); | 2657 | return futex_wait(uaddr, flags, val, timeout, val3); |
2648 | break; | ||
2649 | case FUTEX_WAKE: | 2658 | case FUTEX_WAKE: |
2650 | val3 = FUTEX_BITSET_MATCH_ANY; | 2659 | val3 = FUTEX_BITSET_MATCH_ANY; |
2651 | case FUTEX_WAKE_BITSET: | 2660 | case FUTEX_WAKE_BITSET: |
2652 | ret = futex_wake(uaddr, flags, val, val3); | 2661 | return futex_wake(uaddr, flags, val, val3); |
2653 | break; | ||
2654 | case FUTEX_REQUEUE: | 2662 | case FUTEX_REQUEUE: |
2655 | ret = futex_requeue(uaddr, flags, uaddr2, val, val2, NULL, 0); | 2663 | return futex_requeue(uaddr, flags, uaddr2, val, val2, NULL, 0); |
2656 | break; | ||
2657 | case FUTEX_CMP_REQUEUE: | 2664 | case FUTEX_CMP_REQUEUE: |
2658 | ret = futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 0); | 2665 | return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 0); |
2659 | break; | ||
2660 | case FUTEX_WAKE_OP: | 2666 | case FUTEX_WAKE_OP: |
2661 | ret = futex_wake_op(uaddr, flags, uaddr2, val, val2, val3); | 2667 | return futex_wake_op(uaddr, flags, uaddr2, val, val2, val3); |
2662 | break; | ||
2663 | case FUTEX_LOCK_PI: | 2668 | case FUTEX_LOCK_PI: |
2664 | if (futex_cmpxchg_enabled) | 2669 | return futex_lock_pi(uaddr, flags, val, timeout, 0); |
2665 | ret = futex_lock_pi(uaddr, flags, val, timeout, 0); | ||
2666 | break; | ||
2667 | case FUTEX_UNLOCK_PI: | 2670 | case FUTEX_UNLOCK_PI: |
2668 | if (futex_cmpxchg_enabled) | 2671 | return futex_unlock_pi(uaddr, flags); |
2669 | ret = futex_unlock_pi(uaddr, flags); | ||
2670 | break; | ||
2671 | case FUTEX_TRYLOCK_PI: | 2672 | case FUTEX_TRYLOCK_PI: |
2672 | if (futex_cmpxchg_enabled) | 2673 | return futex_lock_pi(uaddr, flags, 0, timeout, 1); |
2673 | ret = futex_lock_pi(uaddr, flags, 0, timeout, 1); | ||
2674 | break; | ||
2675 | case FUTEX_WAIT_REQUEUE_PI: | 2674 | case FUTEX_WAIT_REQUEUE_PI: |
2676 | val3 = FUTEX_BITSET_MATCH_ANY; | 2675 | val3 = FUTEX_BITSET_MATCH_ANY; |
2677 | ret = futex_wait_requeue_pi(uaddr, flags, val, timeout, val3, | 2676 | return futex_wait_requeue_pi(uaddr, flags, val, timeout, val3, |
2678 | uaddr2); | 2677 | uaddr2); |
2679 | break; | ||
2680 | case FUTEX_CMP_REQUEUE_PI: | 2678 | case FUTEX_CMP_REQUEUE_PI: |
2681 | ret = futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 1); | 2679 | return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 1); |
2682 | break; | ||
2683 | default: | ||
2684 | ret = -ENOSYS; | ||
2685 | } | 2680 | } |
2686 | return ret; | 2681 | return -ENOSYS; |
2687 | } | 2682 | } |
2688 | 2683 | ||
2689 | 2684 | ||