aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/exit.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/exit.c')
-rw-r--r--kernel/exit.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index e61891f80123..80ae941cfd2e 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -49,6 +49,7 @@
49#include <linux/init_task.h> 49#include <linux/init_task.h>
50#include <linux/perf_event.h> 50#include <linux/perf_event.h>
51#include <trace/events/sched.h> 51#include <trace/events/sched.h>
52#include <linux/hw_breakpoint.h>
52 53
53#include <asm/uaccess.h> 54#include <asm/uaccess.h>
54#include <asm/unistd.h> 55#include <asm/unistd.h>
@@ -110,9 +111,9 @@ static void __exit_signal(struct task_struct *tsk)
110 * We won't ever get here for the group leader, since it 111 * We won't ever get here for the group leader, since it
111 * will have been the last reference on the signal_struct. 112 * will have been the last reference on the signal_struct.
112 */ 113 */
113 sig->utime = cputime_add(sig->utime, task_utime(tsk)); 114 sig->utime = cputime_add(sig->utime, tsk->utime);
114 sig->stime = cputime_add(sig->stime, task_stime(tsk)); 115 sig->stime = cputime_add(sig->stime, tsk->stime);
115 sig->gtime = cputime_add(sig->gtime, task_gtime(tsk)); 116 sig->gtime = cputime_add(sig->gtime, tsk->gtime);
116 sig->min_flt += tsk->min_flt; 117 sig->min_flt += tsk->min_flt;
117 sig->maj_flt += tsk->maj_flt; 118 sig->maj_flt += tsk->maj_flt;
118 sig->nvcsw += tsk->nvcsw; 119 sig->nvcsw += tsk->nvcsw;
@@ -359,10 +360,8 @@ void __set_special_pids(struct pid *pid)
359{ 360{
360 struct task_struct *curr = current->group_leader; 361 struct task_struct *curr = current->group_leader;
361 362
362 if (task_session(curr) != pid) { 363 if (task_session(curr) != pid)
363 change_pid(curr, PIDTYPE_SID, pid); 364 change_pid(curr, PIDTYPE_SID, pid);
364 proc_sid_connector(curr);
365 }
366 365
367 if (task_pgrp(curr) != pid) 366 if (task_pgrp(curr) != pid)
368 change_pid(curr, PIDTYPE_PGID, pid); 367 change_pid(curr, PIDTYPE_PGID, pid);
@@ -980,6 +979,10 @@ NORET_TYPE void do_exit(long code)
980 proc_exit_connector(tsk); 979 proc_exit_connector(tsk);
981 980
982 /* 981 /*
982 * FIXME: do that only when needed, using sched_exit tracepoint
983 */
984 flush_ptrace_hw_breakpoint(tsk);
985 /*
983 * Flush inherited counters to the parent - before the parent 986 * Flush inherited counters to the parent - before the parent
984 * gets woken up by child-exit notifications. 987 * gets woken up by child-exit notifications.
985 */ 988 */
@@ -1207,6 +1210,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1207 struct signal_struct *psig; 1210 struct signal_struct *psig;
1208 struct signal_struct *sig; 1211 struct signal_struct *sig;
1209 unsigned long maxrss; 1212 unsigned long maxrss;
1213 cputime_t tgutime, tgstime;
1210 1214
1211 /* 1215 /*
1212 * The resource counters for the group leader are in its 1216 * The resource counters for the group leader are in its
@@ -1222,20 +1226,23 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
1222 * need to protect the access to parent->signal fields, 1226 * need to protect the access to parent->signal fields,
1223 * as other threads in the parent group can be right 1227 * as other threads in the parent group can be right
1224 * here reaping other children at the same time. 1228 * here reaping other children at the same time.
1229 *
1230 * We use thread_group_times() to get times for the thread
1231 * group, which consolidates times for all threads in the
1232 * group including the group leader.
1225 */ 1233 */
1234 thread_group_times(p, &tgutime, &tgstime);
1226 spin_lock_irq(&p->real_parent->sighand->siglock); 1235 spin_lock_irq(&p->real_parent->sighand->siglock);
1227 psig = p->real_parent->signal; 1236 psig = p->real_parent->signal;
1228 sig = p->signal; 1237 sig = p->signal;
1229 psig->cutime = 1238 psig->cutime =
1230 cputime_add(psig->cutime, 1239 cputime_add(psig->cutime,
1231 cputime_add(p->utime, 1240 cputime_add(tgutime,
1232 cputime_add(sig->utime, 1241 sig->cutime));
1233 sig->cutime)));
1234 psig->cstime = 1242 psig->cstime =
1235 cputime_add(psig->cstime, 1243 cputime_add(psig->cstime,
1236 cputime_add(p->stime, 1244 cputime_add(tgstime,
1237 cputime_add(sig->stime, 1245 sig->cstime));
1238 sig->cstime)));
1239 psig->cgtime = 1246 psig->cgtime =
1240 cputime_add(psig->cgtime, 1247 cputime_add(psig->cgtime,
1241 cputime_add(p->gtime, 1248 cputime_add(p->gtime,