Commit 8e31108b9f41069d55cb9b019ac8262c55fd2616

Authored by Andrew Morton
Committed by Linus Torvalds
1 parent 6003a93e7b

[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 <steiner@sgi.com>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 1 changed file with 6 additions and 0 deletions Side-by-side Diff

... ... @@ -270,7 +270,13 @@
270 270 /*
271 271 * The waiting task can free the futex_q as soon as this is written,
272 272 * without taking any locks. This must come last.
  273 + *
  274 + * A memory barrier is required here to prevent the following store
  275 + * to lock_ptr from getting ahead of the wakeup. Clearing the lock
  276 + * at the end of wake_up_all() does not prevent this store from
  277 + * moving.
273 278 */
  279 + wmb();
274 280 q->lock_ptr = NULL;
275 281 }
276 282