aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/futex.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/futex.c')
-rw-r--r--kernel/futex.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/kernel/futex.c b/kernel/futex.c
index 06938e560ac9..fb65e822fc41 100644
--- a/kernel/futex.c
+++ b/kernel/futex.c
@@ -1029,7 +1029,6 @@ static inline
1029void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, 1029void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key,
1030 struct futex_hash_bucket *hb) 1030 struct futex_hash_bucket *hb)
1031{ 1031{
1032 drop_futex_key_refs(&q->key);
1033 get_futex_key_refs(key); 1032 get_futex_key_refs(key);
1034 q->key = *key; 1033 q->key = *key;
1035 1034
@@ -1227,6 +1226,7 @@ retry_private:
1227 */ 1226 */
1228 if (ret == 1) { 1227 if (ret == 1) {
1229 WARN_ON(pi_state); 1228 WARN_ON(pi_state);
1229 drop_count++;
1230 task_count++; 1230 task_count++;
1231 ret = get_futex_value_locked(&curval2, uaddr2); 1231 ret = get_futex_value_locked(&curval2, uaddr2);
1232 if (!ret) 1232 if (!ret)
@@ -1305,6 +1305,7 @@ retry_private:
1305 if (ret == 1) { 1305 if (ret == 1) {
1306 /* We got the lock. */ 1306 /* We got the lock. */
1307 requeue_pi_wake_futex(this, &key2, hb2); 1307 requeue_pi_wake_futex(this, &key2, hb2);
1308 drop_count++;
1308 continue; 1309 continue;
1309 } else if (ret) { 1310 } else if (ret) {
1310 /* -EDEADLK */ 1311 /* -EDEADLK */
@@ -2126,7 +2127,7 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb,
2126 plist_del(&q->list, &q->list.plist); 2127 plist_del(&q->list, &q->list.plist);
2127 2128
2128 /* Handle spurious wakeups gracefully */ 2129 /* Handle spurious wakeups gracefully */
2129 ret = -EAGAIN; 2130 ret = -EWOULDBLOCK;
2130 if (timeout && !timeout->task) 2131 if (timeout && !timeout->task)
2131 ret = -ETIMEDOUT; 2132 ret = -ETIMEDOUT;
2132 else if (signal_pending(current)) 2133 else if (signal_pending(current))
@@ -2207,7 +2208,6 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, int fshared,
2207 debug_rt_mutex_init_waiter(&rt_waiter); 2208 debug_rt_mutex_init_waiter(&rt_waiter);
2208 rt_waiter.task = NULL; 2209 rt_waiter.task = NULL;
2209 2210
2210retry:
2211 key2 = FUTEX_KEY_INIT; 2211 key2 = FUTEX_KEY_INIT;
2212 ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE); 2212 ret = get_futex_key(uaddr2, fshared, &key2, VERIFY_WRITE);
2213 if (unlikely(ret != 0)) 2213 if (unlikely(ret != 0))
@@ -2302,9 +2302,6 @@ out_put_keys:
2302out_key2: 2302out_key2:
2303 put_futex_key(fshared, &key2); 2303 put_futex_key(fshared, &key2);
2304 2304
2305 /* Spurious wakeup ? */
2306 if (ret == -EAGAIN)
2307 goto retry;
2308out: 2305out:
2309 if (to) { 2306 if (to) {
2310 hrtimer_cancel(&to->timer); 2307 hrtimer_cancel(&to->timer);