aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/exit.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/exit.c')
-rw-r--r--kernel/exit.c162
1 files changed, 92 insertions, 70 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index ae5d8660ddff..f7864ac2ecc1 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -47,7 +47,7 @@
47#include <linux/tracehook.h> 47#include <linux/tracehook.h>
48#include <linux/fs_struct.h> 48#include <linux/fs_struct.h>
49#include <linux/init_task.h> 49#include <linux/init_task.h>
50#include <linux/perf_counter.h> 50#include <linux/perf_event.h>
51#include <trace/events/sched.h> 51#include <trace/events/sched.h>
52 52
53#include <asm/uaccess.h> 53#include <asm/uaccess.h>
@@ -154,8 +154,8 @@ static void delayed_put_task_struct(struct rcu_head *rhp)
154{ 154{
155 struct task_struct *tsk = container_of(rhp, struct task_struct, rcu); 155 struct task_struct *tsk = container_of(rhp, struct task_struct, rcu);
156 156
157#ifdef CONFIG_PERF_COUNTERS 157#ifdef CONFIG_PERF_EVENTS
158 WARN_ON_ONCE(tsk->perf_counter_ctxp); 158 WARN_ON_ONCE(tsk->perf_event_ctxp);
159#endif 159#endif
160 trace_sched_process_free(tsk); 160 trace_sched_process_free(tsk);
161 put_task_struct(tsk); 161 put_task_struct(tsk);
@@ -945,6 +945,8 @@ NORET_TYPE void do_exit(long code)
945 if (group_dead) { 945 if (group_dead) {
946 hrtimer_cancel(&tsk->signal->real_timer); 946 hrtimer_cancel(&tsk->signal->real_timer);
947 exit_itimers(tsk->signal); 947 exit_itimers(tsk->signal);
948 if (tsk->mm)
949 setmax_mm_hiwater_rss(&tsk->signal->maxrss, tsk->mm);
948 } 950 }
949 acct_collect(code, group_dead); 951 acct_collect(code, group_dead);
950 if (group_dead) 952 if (group_dead)
@@ -972,8 +974,6 @@ NORET_TYPE void do_exit(long code)
972 disassociate_ctty(1); 974 disassociate_ctty(1);
973 975
974 module_put(task_thread_info(tsk)->exec_domain->module); 976 module_put(task_thread_info(tsk)->exec_domain->module);
975 if (tsk->binfmt)
976 module_put(tsk->binfmt->module);
977 977
978 proc_exit_connector(tsk); 978 proc_exit_connector(tsk);
979 979
@@ -981,7 +981,7 @@ NORET_TYPE void do_exit(long code)
981 * Flush inherited counters to the parent - before the parent 981 * Flush inherited counters to the parent - before the parent
982 * gets woken up by child-exit notifications. 982 * gets woken up by child-exit notifications.
983 */ 983 */
984 perf_counter_exit_task(tsk); 984 perf_event_exit_task(tsk);
985 985
986 exit_notify(tsk, group_dead); 986 exit_notify(tsk, group_dead);
987#ifdef CONFIG_NUMA 987#ifdef CONFIG_NUMA
@@ -989,8 +989,6 @@ NORET_TYPE void do_exit(long code)
989 tsk->mempolicy = NULL; 989 tsk->mempolicy = NULL;
990#endif 990#endif
991#ifdef CONFIG_FUTEX 991#ifdef CONFIG_FUTEX
992 if (unlikely(!list_empty(&tsk->pi_state_list)))
993 exit_pi_state_list(tsk);
994 if (unlikely(current->pi_state_cache)) 992 if (unlikely(current->pi_state_cache))
995 kfree(current->pi_state_cache); 993 kfree(current->pi_state_cache);
996#endif 994#endif
@@ -1093,28 +1091,28 @@ struct wait_opts {
1093 int __user *wo_stat; 1091 int __user *wo_stat;
1094 struct rusage __user *wo_rusage; 1092 struct rusage __user *wo_rusage;
1095 1093
1094 wait_queue_t child_wait;
1096 int notask_error; 1095 int notask_error;
1097}; 1096};
1098 1097
1099static struct pid *task_pid_type(struct task_struct *task, enum pid_type type) 1098static inline
1099struct pid *task_pid_type(struct task_struct *task, enum pid_type type)
1100{ 1100{
1101 struct pid *pid = NULL; 1101 if (type != PIDTYPE_PID)
1102 if (type == PIDTYPE_PID) 1102 task = task->group_leader;
1103 pid = task->pids[type].pid; 1103 return task->pids[type].pid;
1104 else if (type < PIDTYPE_MAX)
1105 pid = task->group_leader->pids[type].pid;
1106 return pid;
1107} 1104}
1108 1105
1109static int eligible_child(struct wait_opts *wo, struct task_struct *p) 1106static int eligible_pid(struct wait_opts *wo, struct task_struct *p)
1110{ 1107{
1111 int err; 1108 return wo->wo_type == PIDTYPE_MAX ||
1112 1109 task_pid_type(p, wo->wo_type) == wo->wo_pid;
1113 if (wo->wo_type < PIDTYPE_MAX) { 1110}
1114 if (task_pid_type(p, wo->wo_type) != wo->wo_pid)
1115 return 0;
1116 }
1117 1111
1112static int eligible_child(struct wait_opts *wo, struct task_struct *p)
1113{
1114 if (!eligible_pid(wo, p))
1115 return 0;
1118 /* Wait for all children (clone and not) if __WALL is set; 1116 /* Wait for all children (clone and not) if __WALL is set;
1119 * otherwise, wait for clone children *only* if __WCLONE is 1117 * otherwise, wait for clone children *only* if __WCLONE is
1120 * set; otherwise, wait for non-clone children *only*. (Note: 1118 * set; otherwise, wait for non-clone children *only*. (Note:
@@ -1124,10 +1122,6 @@ static int eligible_child(struct wait_opts *wo, struct task_struct *p)
1124 && !(wo->wo_flags & __WALL)) 1122 && !(wo->wo_flags & __WALL))
1125 return 0; 1123 return 0;
1126 1124
1127 err = security_task_wait(p);
1128 if (err)
1129 return err;
1130
1131 return 1; 1125 return 1;
1132} 1126}
1133 1127
@@ -1140,18 +1134,20 @@ static int wait_noreap_copyout(struct wait_opts *wo, struct task_struct *p,
1140 1134
1141 put_task_struct(p); 1135 put_task_struct(p);
1142 infop = wo->wo_info; 1136 infop = wo->wo_info;
1143 if (!retval) 1137 if (infop) {
1144 retval = put_user(SIGCHLD, &infop->si_signo); 1138 if (!retval)
1145 if (!retval) 1139 retval = put_user(SIGCHLD, &infop->si_signo);
1146 retval = put_user(0, &infop->si_errno); 1140 if (!retval)
1147 if (!retval) 1141 retval = put_user(0, &infop->si_errno);
1148 retval = put_user((short)why, &infop->si_code); 1142 if (!retval)
1149 if (!retval) 1143 retval = put_user((short)why, &infop->si_code);
1150 retval = put_user(pid, &infop->si_pid); 1144 if (!retval)
1151 if (!retval) 1145 retval = put_user(pid, &infop->si_pid);
1152 retval = put_user(uid, &infop->si_uid); 1146 if (!retval)
1153 if (!retval) 1147 retval = put_user(uid, &infop->si_uid);
1154 retval = put_user(status, &infop->si_status); 1148 if (!retval)
1149 retval = put_user(status, &infop->si_status);
1150 }
1155 if (!retval) 1151 if (!retval)
1156 retval = pid; 1152 retval = pid;
1157 return retval; 1153 return retval;
@@ -1208,6 +1204,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1208 if (likely(!traced) && likely(!task_detached(p))) { 1204 if (likely(!traced) && likely(!task_detached(p))) {
1209 struct signal_struct *psig; 1205 struct signal_struct *psig;
1210 struct signal_struct *sig; 1206 struct signal_struct *sig;
1207 unsigned long maxrss;
1211 1208
1212 /* 1209 /*
1213 * The resource counters for the group leader are in its 1210 * The resource counters for the group leader are in its
@@ -1256,6 +1253,9 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1256 psig->coublock += 1253 psig->coublock +=
1257 task_io_get_oublock(p) + 1254 task_io_get_oublock(p) +
1258 sig->oublock + sig->coublock; 1255 sig->oublock + sig->coublock;
1256 maxrss = max(sig->maxrss, sig->cmaxrss);
1257 if (psig->cmaxrss < maxrss)
1258 psig->cmaxrss = maxrss;
1259 task_io_accounting_add(&psig->ioac, &p->ioac); 1259 task_io_accounting_add(&psig->ioac, &p->ioac);
1260 task_io_accounting_add(&psig->ioac, &sig->ioac); 1260 task_io_accounting_add(&psig->ioac, &sig->ioac);
1261 spin_unlock_irq(&p->real_parent->sighand->siglock); 1261 spin_unlock_irq(&p->real_parent->sighand->siglock);
@@ -1477,13 +1477,14 @@ static int wait_task_continued(struct wait_opts *wo, struct task_struct *p)
1477 * then ->notask_error is 0 if @p is an eligible child, 1477 * then ->notask_error is 0 if @p is an eligible child,
1478 * or another error from security_task_wait(), or still -ECHILD. 1478 * or another error from security_task_wait(), or still -ECHILD.
1479 */ 1479 */
1480static int wait_consider_task(struct wait_opts *wo, struct task_struct *parent, 1480static int wait_consider_task(struct wait_opts *wo, int ptrace,
1481 int ptrace, struct task_struct *p) 1481 struct task_struct *p)
1482{ 1482{
1483 int ret = eligible_child(wo, p); 1483 int ret = eligible_child(wo, p);
1484 if (!ret) 1484 if (!ret)
1485 return ret; 1485 return ret;
1486 1486
1487 ret = security_task_wait(p);
1487 if (unlikely(ret < 0)) { 1488 if (unlikely(ret < 0)) {
1488 /* 1489 /*
1489 * If we have not yet seen any eligible child, 1490 * If we have not yet seen any eligible child,
@@ -1545,7 +1546,7 @@ static int do_wait_thread(struct wait_opts *wo, struct task_struct *tsk)
1545 * Do not consider detached threads. 1546 * Do not consider detached threads.
1546 */ 1547 */
1547 if (!task_detached(p)) { 1548 if (!task_detached(p)) {
1548 int ret = wait_consider_task(wo, tsk, 0, p); 1549 int ret = wait_consider_task(wo, 0, p);
1549 if (ret) 1550 if (ret)
1550 return ret; 1551 return ret;
1551 } 1552 }
@@ -1559,7 +1560,7 @@ static int ptrace_do_wait(struct wait_opts *wo, struct task_struct *tsk)
1559 struct task_struct *p; 1560 struct task_struct *p;
1560 1561
1561 list_for_each_entry(p, &tsk->ptraced, ptrace_entry) { 1562 list_for_each_entry(p, &tsk->ptraced, ptrace_entry) {
1562 int ret = wait_consider_task(wo, tsk, 1, p); 1563 int ret = wait_consider_task(wo, 1, p);
1563 if (ret) 1564 if (ret)
1564 return ret; 1565 return ret;
1565 } 1566 }
@@ -1567,15 +1568,38 @@ static int ptrace_do_wait(struct wait_opts *wo, struct task_struct *tsk)
1567 return 0; 1568 return 0;
1568} 1569}
1569 1570
1571static int child_wait_callback(wait_queue_t *wait, unsigned mode,
1572 int sync, void *key)
1573{
1574 struct wait_opts *wo = container_of(wait, struct wait_opts,
1575 child_wait);
1576 struct task_struct *p = key;
1577
1578 if (!eligible_pid(wo, p))
1579 return 0;
1580
1581 if ((wo->wo_flags & __WNOTHREAD) && wait->private != p->parent)
1582 return 0;
1583
1584 return default_wake_function(wait, mode, sync, key);
1585}
1586
1587void __wake_up_parent(struct task_struct *p, struct task_struct *parent)
1588{
1589 __wake_up_sync_key(&parent->signal->wait_chldexit,
1590 TASK_INTERRUPTIBLE, 1, p);
1591}
1592
1570static long do_wait(struct wait_opts *wo) 1593static long do_wait(struct wait_opts *wo)
1571{ 1594{
1572 DECLARE_WAITQUEUE(wait, current);
1573 struct task_struct *tsk; 1595 struct task_struct *tsk;
1574 int retval; 1596 int retval;
1575 1597
1576 trace_sched_process_wait(wo->wo_pid); 1598 trace_sched_process_wait(wo->wo_pid);
1577 1599
1578 add_wait_queue(&current->signal->wait_chldexit,&wait); 1600 init_waitqueue_func_entry(&wo->child_wait, child_wait_callback);
1601 wo->child_wait.private = current;
1602 add_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
1579repeat: 1603repeat:
1580 /* 1604 /*
1581 * If there is nothing that can match our critiera just get out. 1605 * If there is nothing that can match our critiera just get out.
@@ -1616,32 +1640,7 @@ notask:
1616 } 1640 }
1617end: 1641end:
1618 __set_current_state(TASK_RUNNING); 1642 __set_current_state(TASK_RUNNING);
1619 remove_wait_queue(&current->signal->wait_chldexit,&wait); 1643 remove_wait_queue(&current->signal->wait_chldexit, &wo->child_wait);
1620 if (wo->wo_info) {
1621 struct siginfo __user *infop = wo->wo_info;
1622
1623 if (retval > 0)
1624 retval = 0;
1625 else {
1626 /*
1627 * For a WNOHANG return, clear out all the fields
1628 * we would set so the user can easily tell the
1629 * difference.
1630 */
1631 if (!retval)
1632 retval = put_user(0, &infop->si_signo);
1633 if (!retval)
1634 retval = put_user(0, &infop->si_errno);
1635 if (!retval)
1636 retval = put_user(0, &infop->si_code);
1637 if (!retval)
1638 retval = put_user(0, &infop->si_pid);
1639 if (!retval)
1640 retval = put_user(0, &infop->si_uid);
1641 if (!retval)
1642 retval = put_user(0, &infop->si_status);
1643 }
1644 }
1645 return retval; 1644 return retval;
1646} 1645}
1647 1646
@@ -1686,6 +1685,29 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
1686 wo.wo_stat = NULL; 1685 wo.wo_stat = NULL;
1687 wo.wo_rusage = ru; 1686 wo.wo_rusage = ru;
1688 ret = do_wait(&wo); 1687 ret = do_wait(&wo);
1688
1689 if (ret > 0) {
1690 ret = 0;
1691 } else if (infop) {
1692 /*
1693 * For a WNOHANG return, clear out all the fields
1694 * we would set so the user can easily tell the
1695 * difference.
1696 */
1697 if (!ret)
1698 ret = put_user(0, &infop->si_signo);
1699 if (!ret)
1700 ret = put_user(0, &infop->si_errno);
1701 if (!ret)
1702 ret = put_user(0, &infop->si_code);
1703 if (!ret)
1704 ret = put_user(0, &infop->si_pid);
1705 if (!ret)
1706 ret = put_user(0, &infop->si_uid);
1707 if (!ret)
1708 ret = put_user(0, &infop->si_status);
1709 }
1710
1689 put_pid(pid); 1711 put_pid(pid);
1690 1712
1691 /* avoid REGPARM breakage on x86: */ 1713 /* avoid REGPARM breakage on x86: */