diff options
author | Darren Hart <dvhltc@us.ibm.com> | 2009-04-21 01:22:22 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2009-04-30 05:41:35 -0400 |
commit | ba9c22f2c01cf5c88beed5a6b9e07d42e10bd358 (patch) | |
tree | 77664171b51bb6b03eac13ee946b6d894b2da01d | |
parent | a5a2a0c7fa039c59619bc908b3b1ed24734d442a (diff) |
futex: remove FUTEX_REQUEUE_PI (non CMP)
The new requeue PI futex op codes were modeled after the existing
FUTEX_REQUEUE and FUTEX_CMP_REQUEUE calls. I was unaware at the time
that FUTEX_REQUEUE was only around for compatibility reasons and
shouldn't be used in new code. Ulrich Drepper elaborates on this in his
Futexes are Tricky paper: http://people.redhat.com/drepper/futex.pdf.
The deprecated call doesn't catch changes to the futex corresponding to
the destination futex which can lead to deadlock.
Therefor, I feel it best to remove FUTEX_REQUEUE_PI and leave only
FUTEX_CMP_REQUEUE_PI as there are not yet any existing users of the API.
This patch does change the OP code value of FUTEX_CMP_REQUEUE_PI to 12
from 13. Since my test case is the only known user of this API, I felt
this was the right thing to do, rather than leave a hole in the
enumeration.
I chose to continue using the _CMP_ modifier in the OP code to make it
explicit to the user that the test is being done.
Builds, boots, and ran several hundred iterations requeue_pi.c.
Signed-off-by: Darren Hart <dvhltc@us.ibm.com>
LKML-Reference: <49ED580E.1050502@us.ibm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | include/linux/futex.h | 4 | ||||
-rw-r--r-- | kernel/futex.c | 6 |
2 files changed, 2 insertions, 8 deletions
diff --git a/include/linux/futex.h b/include/linux/futex.h index b05519ca9e57..34956c8fdebf 100644 --- a/include/linux/futex.h +++ b/include/linux/futex.h | |||
@@ -24,8 +24,7 @@ union ktime; | |||
24 | #define FUTEX_WAIT_BITSET 9 | 24 | #define FUTEX_WAIT_BITSET 9 |
25 | #define FUTEX_WAKE_BITSET 10 | 25 | #define FUTEX_WAKE_BITSET 10 |
26 | #define FUTEX_WAIT_REQUEUE_PI 11 | 26 | #define FUTEX_WAIT_REQUEUE_PI 11 |
27 | #define FUTEX_REQUEUE_PI 12 | 27 | #define FUTEX_CMP_REQUEUE_PI 12 |
28 | #define FUTEX_CMP_REQUEUE_PI 13 | ||
29 | 28 | ||
30 | #define FUTEX_PRIVATE_FLAG 128 | 29 | #define FUTEX_PRIVATE_FLAG 128 |
31 | #define FUTEX_CLOCK_REALTIME 256 | 30 | #define FUTEX_CLOCK_REALTIME 256 |
@@ -43,7 +42,6 @@ union ktime; | |||
43 | #define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITS | FUTEX_PRIVATE_FLAG) | 42 | #define FUTEX_WAKE_BITSET_PRIVATE (FUTEX_WAKE_BITS | FUTEX_PRIVATE_FLAG) |
44 | #define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | \ | 43 | #define FUTEX_WAIT_REQUEUE_PI_PRIVATE (FUTEX_WAIT_REQUEUE_PI | \ |
45 | FUTEX_PRIVATE_FLAG) | 44 | FUTEX_PRIVATE_FLAG) |
46 | #define FUTEX_REQUEUE_PI_PRIVATE (FUTEX_REQUEUE_PI | FUTEX_PRIVATE_FLAG) | ||
47 | #define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | \ | 45 | #define FUTEX_CMP_REQUEUE_PI_PRIVATE (FUTEX_CMP_REQUEUE_PI | \ |
48 | FUTEX_PRIVATE_FLAG) | 46 | FUTEX_PRIVATE_FLAG) |
49 | 47 | ||
diff --git a/kernel/futex.c b/kernel/futex.c index 6d2daa46f9ff..aec8bf89bf4e 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -2555,9 +2555,6 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout, | |||
2555 | ret = futex_wait_requeue_pi(uaddr, fshared, val, timeout, val3, | 2555 | ret = futex_wait_requeue_pi(uaddr, fshared, val, timeout, val3, |
2556 | clockrt, uaddr2); | 2556 | clockrt, uaddr2); |
2557 | break; | 2557 | break; |
2558 | case FUTEX_REQUEUE_PI: | ||
2559 | ret = futex_requeue(uaddr, fshared, uaddr2, val, val2, NULL, 1); | ||
2560 | break; | ||
2561 | case FUTEX_CMP_REQUEUE_PI: | 2558 | case FUTEX_CMP_REQUEUE_PI: |
2562 | ret = futex_requeue(uaddr, fshared, uaddr2, val, val2, &val3, | 2559 | ret = futex_requeue(uaddr, fshared, uaddr2, val, val2, &val3, |
2563 | 1); | 2560 | 1); |
@@ -2596,8 +2593,7 @@ SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, | |||
2596 | * number of waiters to wake in 'utime' if cmd == FUTEX_WAKE_OP. | 2593 | * number of waiters to wake in 'utime' if cmd == FUTEX_WAKE_OP. |
2597 | */ | 2594 | */ |
2598 | if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE || | 2595 | if (cmd == FUTEX_REQUEUE || cmd == FUTEX_CMP_REQUEUE || |
2599 | cmd == FUTEX_REQUEUE_PI || cmd == FUTEX_CMP_REQUEUE_PI || | 2596 | cmd == FUTEX_CMP_REQUEUE_PI || cmd == FUTEX_WAKE_OP) |
2600 | cmd == FUTEX_WAKE_OP) | ||
2601 | val2 = (u32) (unsigned long) utime; | 2597 | val2 = (u32) (unsigned long) utime; |
2602 | 2598 | ||
2603 | return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); | 2599 | return do_futex(uaddr, op, val, tp, uaddr2, val2, val3); |