diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2008-12-01 14:18:16 -0800 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-12-12 17:01:03 +0100 |
commit | 8187926bdae98648db24db3391c4efd21ec669b1 (patch) | |
tree | e3f35eee71cdaefcf6af15471a7aee3444e658d4 /fs/exec.c | |
parent | 899921025b406a71a8aeb2d7855658ea0cf0ed23 (diff) | |
download | blackbird-op-linux-8187926bdae98648db24db3391c4efd21ec669b1.tar.gz blackbird-op-linux-8187926bdae98648db24db3391c4efd21ec669b1.zip |
posix-timers: simplify de_thread()->exit_itimers() path
Impact: simplify code
de_thread() postpones release_task(leader) until after exit_itimers().
This was needed because !SIGEV_THREAD_ID timers could use ->group_leader
without get_task_struct(). With the recent changes we can release the
leader earlier and simplify the code.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/fs/exec.c b/fs/exec.c index ec5df9a38313..b4e5b8a9216a 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -772,7 +772,6 @@ static int de_thread(struct task_struct *tsk) struct signal_struct *sig = tsk->signal; struct sighand_struct *oldsighand = tsk->sighand; spinlock_t *lock = &oldsighand->siglock; - struct task_struct *leader = NULL; int count; if (thread_group_empty(tsk)) @@ -810,7 +809,7 @@ static int de_thread(struct task_struct *tsk) * and to assume its PID: */ if (!thread_group_leader(tsk)) { - leader = tsk->group_leader; + struct task_struct *leader = tsk->group_leader; sig->notify_count = -1; /* for exit_notify() */ for (;;) { @@ -862,8 +861,9 @@ static int de_thread(struct task_struct *tsk) BUG_ON(leader->exit_state != EXIT_ZOMBIE); leader->exit_state = EXIT_DEAD; - write_unlock_irq(&tasklist_lock); + + release_task(leader); } sig->group_exit_task = NULL; @@ -872,8 +872,6 @@ static int de_thread(struct task_struct *tsk) no_thread_group: exit_itimers(sig); flush_itimer_signals(); - if (leader) - release_task(leader); if (atomic_read(&oldsighand->count) != 1) { struct sighand_struct *newsighand; |