diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2007-10-16 23:26:47 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-17 08:42:51 -0700 |
commit | d2ee7198cc2414aade234a3cebc69e6cbff35d9b (patch) | |
tree | e89d52b8b64f6eb675add025ba8507863e4bc0f8 /kernel/exit.c | |
parent | 7917ff9a4cefd0500aa4a1b1942da96dbce6999f (diff) | |
download | lwn-d2ee7198cc2414aade234a3cebc69e6cbff35d9b.tar.gz lwn-d2ee7198cc2414aade234a3cebc69e6cbff35d9b.zip |
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) schedule(); } + tsk->flags |= PF_EXITING; /* * tsk->flags are checked in the futex code to protect against * an exiting task cleaning up the robust pi futexes. */ - spin_lock_irq(&tsk->pi_lock); - tsk->flags |= PF_EXITING; - spin_unlock_irq(&tsk->pi_lock); + smp_mb(); + spin_unlock_wait(&tsk->pi_lock); if (unlikely(in_atomic())) printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n", |