|
@@ -1656,17 +1656,8 @@ out:
|
|
|
static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q,
|
|
|
struct hrtimer_sleeper *timeout)
|
|
|
{
|
|
|
- queue_me(q, hb);
|
|
|
-
|
|
|
- /*
|
|
|
- * There might have been scheduling since the queue_me(), as we
|
|
|
- * cannot hold a spinlock across the get_user() in case it
|
|
|
- * faults, and we cannot just set TASK_INTERRUPTIBLE state when
|
|
|
- * queueing ourselves into the futex hash. This code thus has to
|
|
|
- * rely on the futex_wake() code removing us from hash when it
|
|
|
- * wakes us up.
|
|
|
- */
|
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
|
+ queue_me(q, hb);
|
|
|
|
|
|
/* Arm the timer */
|
|
|
if (timeout) {
|
|
@@ -1676,8 +1667,8 @@ static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q,
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * !plist_node_empty() is safe here without any lock.
|
|
|
- * q.lock_ptr != 0 is not safe, because of ordering against wakeup.
|
|
|
+ * If we have been removed from the hash list, then another task
|
|
|
+ * has tried to wake us, and we can skip the call to schedule().
|
|
|
*/
|
|
|
if (likely(!plist_node_empty(&q->list))) {
|
|
|
/*
|