Browse Source

[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 <sebastien.dugue@bull.net>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Sebastien Dugue 19 years ago
parent
commit
59e0e0ace7
1 changed files with 8 additions and 5 deletions
  1. 8 5
      kernel/futex.c

+ 8 - 5
kernel/futex.c

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