Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+17 -13
+2 -2
include/linux/sched.h
··· 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 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);
+6 -3
kernel/exit.c
··· 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 /* ··· 859 858 860 859 signal = tracehook_notify_death(tsk, &cookie, group_dead); 861 860 if (signal >= 0) 862 - signal = do_notify_parent(tsk, signal); 861 + autoreap = do_notify_parent(tsk, signal); 862 + else 863 + autoreap = (signal == DEATH_REAP); 863 864 864 - tsk->exit_state = signal == DEATH_REAP ? EXIT_DEAD : EXIT_ZOMBIE; 865 + tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE; 865 866 866 867 /* mt-exec, de_thread() is waiting for group leader */ 867 868 if (unlikely(tsk->signal->notify_count < 0)) ··· 871 868 write_unlock_irq(&tasklist_lock); 872 869 873 870 /* If the process is dead, release it - nobody will wait for it */ 874 - if (signal == DEATH_REAP) 871 + if (autoreap) 875 872 release_task(tsk); 876 873 } 877 874
+9 -8
kernel/signal.c
··· 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 ··· 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 /**