Commit 53c8f9f199b239668e6b1a907735ee323a0d1ccd

Authored by Oleg Nesterov
1 parent 06d984737b

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);
... ... @@ -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  
... ... @@ -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 /**