Commit 8e31108b9f41069d55cb9b019ac8262c55fd2616
Committed by
Linus Torvalds
1 parent
6003a93e7b
Exists in
master
and in
7 other branches
[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
kernel/futex.c
... | ... | @@ -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 |