Commit 53c8f9f199b239668e6b1a907735ee323a0d1ccd
1 parent
06d984737b
Exists in
master
and in
6 other branches
make do_notify_parent() return bool
- change do_notify_parent() to return a boolean, true if the task should be reaped because its parent ignores SIGCHLD. - update the only caller which checks the returned value, exit_notify(). This temporary uglifies exit_notify() even more, will be cleanuped by the next change. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Acked-by: Tejun Heo <tj@kernel.org>
Showing 3 changed files with 17 additions and 13 deletions Side-by-side Diff
include/linux/sched.h
... | ... | @@ -2145,7 +2145,7 @@ |
2145 | 2145 | spin_unlock_irqrestore(&tsk->sighand->siglock, flags); |
2146 | 2146 | |
2147 | 2147 | return ret; |
2148 | -} | |
2148 | +} | |
2149 | 2149 | |
2150 | 2150 | extern void block_all_signals(int (*notifier)(void *priv), void *priv, |
2151 | 2151 | sigset_t *mask); |
... | ... | @@ -2160,7 +2160,7 @@ |
2160 | 2160 | extern int kill_pgrp(struct pid *pid, int sig, int priv); |
2161 | 2161 | extern int kill_pid(struct pid *pid, int sig, int priv); |
2162 | 2162 | extern int kill_proc_info(int, struct siginfo *, pid_t); |
2163 | -extern int do_notify_parent(struct task_struct *, int); | |
2163 | +extern bool do_notify_parent(struct task_struct *, int); | |
2164 | 2164 | extern void __wake_up_parent(struct task_struct *p, struct task_struct *parent); |
2165 | 2165 | extern void force_sig(int, struct task_struct *); |
2166 | 2166 | extern int send_sig(int, struct task_struct *, int); |
kernel/exit.c
... | ... | @@ -820,6 +820,7 @@ |
820 | 820 | static void exit_notify(struct task_struct *tsk, int group_dead) |
821 | 821 | { |
822 | 822 | int signal; |
823 | + bool autoreap; | |
823 | 824 | void *cookie; |
824 | 825 | |
825 | 826 | /* |
826 | 827 | |
... | ... | @@ -858,9 +859,11 @@ |
858 | 859 | |
859 | 860 | signal = tracehook_notify_death(tsk, &cookie, group_dead); |
860 | 861 | if (signal >= 0) |
861 | - signal = do_notify_parent(tsk, signal); | |
862 | + autoreap = do_notify_parent(tsk, signal); | |
863 | + else | |
864 | + autoreap = (signal == DEATH_REAP); | |
862 | 865 | |
863 | - tsk->exit_state = signal == DEATH_REAP ? EXIT_DEAD : EXIT_ZOMBIE; | |
866 | + tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE; | |
864 | 867 | |
865 | 868 | /* mt-exec, de_thread() is waiting for group leader */ |
866 | 869 | if (unlikely(tsk->signal->notify_count < 0)) |
... | ... | @@ -868,7 +871,7 @@ |
868 | 871 | write_unlock_irq(&tasklist_lock); |
869 | 872 | |
870 | 873 | /* If the process is dead, release it - nobody will wait for it */ |
871 | - if (signal == DEATH_REAP) | |
874 | + if (autoreap) | |
872 | 875 | release_task(tsk); |
873 | 876 | } |
874 | 877 |
kernel/signal.c
... | ... | @@ -1577,15 +1577,15 @@ |
1577 | 1577 | * Let a parent know about the death of a child. |
1578 | 1578 | * For a stopped/continued status change, use do_notify_parent_cldstop instead. |
1579 | 1579 | * |
1580 | - * Returns -1 if our parent ignored us and so we've switched to | |
1581 | - * self-reaping, or else @sig. | |
1580 | + * Returns true if our parent ignored us and so we've switched to | |
1581 | + * self-reaping. | |
1582 | 1582 | */ |
1583 | -int do_notify_parent(struct task_struct *tsk, int sig) | |
1583 | +bool do_notify_parent(struct task_struct *tsk, int sig) | |
1584 | 1584 | { |
1585 | 1585 | struct siginfo info; |
1586 | 1586 | unsigned long flags; |
1587 | 1587 | struct sighand_struct *psig; |
1588 | - int ret = sig; | |
1588 | + bool autoreap = false; | |
1589 | 1589 | |
1590 | 1590 | BUG_ON(sig == -1); |
1591 | 1591 | |
1592 | 1592 | |
1593 | 1593 | |
1594 | 1594 | |
... | ... | @@ -1649,16 +1649,17 @@ |
1649 | 1649 | * is implementation-defined: we do (if you don't want |
1650 | 1650 | * it, just use SIG_IGN instead). |
1651 | 1651 | */ |
1652 | - ret = tsk->exit_signal = -1; | |
1652 | + autoreap = true; | |
1653 | + tsk->exit_signal = -1; | |
1653 | 1654 | if (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN) |
1654 | - sig = -1; | |
1655 | + sig = 0; | |
1655 | 1656 | } |
1656 | - if (valid_signal(sig) && sig > 0) | |
1657 | + if (valid_signal(sig) && sig) | |
1657 | 1658 | __group_send_sig_info(sig, &info, tsk->parent); |
1658 | 1659 | __wake_up_parent(tsk, tsk->parent); |
1659 | 1660 | spin_unlock_irqrestore(&psig->siglock, flags); |
1660 | 1661 | |
1661 | - return ret; | |
1662 | + return autoreap; | |
1662 | 1663 | } |
1663 | 1664 | |
1664 | 1665 | /** |