[PATCH] futex_requeue() optimization

In futex_requeue(), when the 2 futexes keys hash to the same bucket, there
is no need to move the futex_q to the end of the bucket list.

Signed-off-by: Sebastien Dugue <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
Sebastien Dugue 2006-06-27 02:55:03 -07:00 • committed by Linus Torvalds
commit 59e0e0ace7

View file

@ -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;
}
}