diff options
Diffstat (limited to 'kernel/futex.c')
-rw-r--r-- | kernel/futex.c | 9 |
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 | |||
1029 | void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, | 1029 | void 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 | ||
2210 | retry: | ||
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: | |||
2302 | out_key2: | 2302 | out_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; | ||
2308 | out: | 2305 | out: |
2309 | if (to) { | 2306 | if (to) { |
2310 | hrtimer_cancel(&to->timer); | 2307 | hrtimer_cancel(&to->timer); |