summaryrefslogtreecommitdiff
path: root/kernel/exit.c
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2007-10-16 23:26:47 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-17 08:42:51 -0700
commitd2ee7198cc2414aade234a3cebc69e6cbff35d9b (patch)
treee89d52b8b64f6eb675add025ba8507863e4bc0f8 /kernel/exit.c
parent7917ff9a4cefd0500aa4a1b1942da96dbce6999f (diff)
downloadlwn-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.c6
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",