|author||Andrew Morton <firstname.lastname@example.org>||2005-12-23 19:54:46 -0800|
|committer||Linus Torvalds <email@example.com>||2005-12-24 12:13:27 -0800|
[PATCH] Fix memory ordering problem in wake_futex()
Fix a memory ordering problem that occurs on IA64. The "store" to q->lock_ptr in wake_futex() can become visible before wake_up_all() clears the lock in the futex_q. Signed-off-by: Jack Steiner <firstname.lastname@example.org> Acked-by: Ingo Molnar <email@example.com> Signed-off-by: Linus Torvalds <firstname.lastname@example.org>
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/futex.c b/kernel/futex.c
index 5872e3507f35..5e71a6bf6f6b 100644
@@ -270,7 +270,13 @@ static void wake_futex(struct futex_q *q)
* The waiting task can free the futex_q as soon as this is written,
* without taking any locks. This must come last.
+ * A memory barrier is required here to prevent the following store
+ * to lock_ptr from getting ahead of the wakeup. Clearing the lock
+ * at the end of wake_up_all() does not prevent this store from
+ * moving.
q->lock_ptr = NULL;