diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2007-10-17 02:26:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 11:42:51 -0400 |
commit | d2ee7198cc2414aade234a3cebc69e6cbff35d9b (patch) | |
tree | e89d52b8b64f6eb675add025ba8507863e4bc0f8 /kernel/exit.c | |
parent | 7917ff9a4cefd0500aa4a1b1942da96dbce6999f (diff) |
pi-futex: set PF_EXITING without taking ->pi_lock
It is a bit annoying that do_exit() takes ->pi_lock to set PF_EXITING. All
we need is to synchronize with lookup_pi_state() which saw this task
without PF_EXITING under ->pi_lock.
Change do_exit() to use spin_unlock_wait().
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Acked-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/exit.c')
-rw-r--r-- | kernel/exit.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 6ca1e4666e9f..3b8dfffd9329 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -931,13 +931,13 @@ fastcall NORET_TYPE void do_exit(long code) | |||
931 | schedule(); | 931 | schedule(); |
932 | } | 932 | } |
933 | 933 | ||
934 | tsk->flags |= PF_EXITING; | ||
934 | /* | 935 | /* |
935 | * tsk->flags are checked in the futex code to protect against | 936 | * tsk->flags are checked in the futex code to protect against |
936 | * an exiting task cleaning up the robust pi futexes. | 937 | * an exiting task cleaning up the robust pi futexes. |
937 | */ | 938 | */ |
938 | spin_lock_irq(&tsk->pi_lock); | 939 | smp_mb(); |
939 | tsk->flags |= PF_EXITING; | 940 | spin_unlock_wait(&tsk->pi_lock); |
940 | spin_unlock_irq(&tsk->pi_lock); | ||
941 | 941 | ||
942 | if (unlikely(in_atomic())) | 942 | if (unlikely(in_atomic())) |
943 | printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n", | 943 | printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n", |