diff --git a/[refs] b/[refs] index 75c7b2b1edd1..8adeefc4564a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 95e02ca9bb5324360e7dea1ea1c563036d84a5e6 +refs/heads/master: 59e0e0ace7d33e8c0c125042f153f80fcc56b39e diff --git a/trunk/kernel/futex.c b/trunk/kernel/futex.c index b305b7f8dad5..6c91f938005d 100644 --- a/trunk/kernel/futex.c +++ b/trunk/kernel/futex.c @@ -827,17 +827,20 @@ static int futex_requeue(u32 __user *uaddr1, u32 __user *uaddr2, if (++ret <= nr_wake) { wake_futex(this); } else { - list_move_tail(&this->list, &hb2->chain); - this->lock_ptr = &hb2->lock; + /* + * If key1 and key2 hash to the same bucket, no need to + * requeue. + */ + if (likely(head1 != &hb2->chain)) { + list_move_tail(&this->list, &hb2->chain); + this->lock_ptr = &hb2->lock; + } this->key = key2; get_key_refs(&key2); drop_count++; if (ret - nr_wake >= nr_requeue) break; - /* Make sure to stop if key1 == key2: */ - if (head1 == &hb2->chain && head1 != &next->list) - head1 = &this->list; } }