Commit 59e0e0ac authored by Sebastien Dugue's avatar Sebastien Dugue Committed by Linus Torvalds

[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: default avatarSebastien Dugue <sebastien.dugue@bull.net>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 95e02ca9
...@@ -827,17 +827,20 @@ static int futex_requeue(u32 __user *uaddr1, u32 __user *uaddr2, ...@@ -827,17 +827,20 @@ static int futex_requeue(u32 __user *uaddr1, u32 __user *uaddr2,
if (++ret <= nr_wake) { if (++ret <= nr_wake) {
wake_futex(this); wake_futex(this);
} else { } else {
/*
* 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); list_move_tail(&this->list, &hb2->chain);
this->lock_ptr = &hb2->lock; this->lock_ptr = &hb2->lock;
}
this->key = key2; this->key = key2;
get_key_refs(&key2); get_key_refs(&key2);
drop_count++; drop_count++;
if (ret - nr_wake >= nr_requeue) if (ret - nr_wake >= nr_requeue)
break; break;
/* Make sure to stop if key1 == key2: */
if (head1 == &hb2->chain && head1 != &next->list)
head1 = &this->list;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment