diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 26 | 
1 files changed, 15 insertions, 11 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index 3f45e3cf931d..6f50ef55a6f3 100644 --- a/kernel/exit.c +++ b/kernel/exit.c  | |||
| @@ -111,9 +111,9 @@ static void __exit_signal(struct task_struct *tsk) | |||
| 111 | * 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 | 
| 112 | * will have been the last reference on the signal_struct. | 112 | * will have been the last reference on the signal_struct. | 
| 113 | */ | 113 | */ | 
| 114 | sig->utime = cputime_add(sig->utime, task_utime(tsk)); | 114 | sig->utime = cputime_add(sig->utime, tsk->utime); | 
| 115 | sig->stime = cputime_add(sig->stime, task_stime(tsk)); | 115 | sig->stime = cputime_add(sig->stime, tsk->stime); | 
| 116 | sig->gtime = cputime_add(sig->gtime, task_gtime(tsk)); | 116 | sig->gtime = cputime_add(sig->gtime, tsk->gtime); | 
| 117 | sig->min_flt += tsk->min_flt; | 117 | sig->min_flt += tsk->min_flt; | 
| 118 | sig->maj_flt += tsk->maj_flt; | 118 | sig->maj_flt += tsk->maj_flt; | 
| 119 | sig->nvcsw += tsk->nvcsw; | 119 | sig->nvcsw += tsk->nvcsw; | 
| @@ -971,7 +971,7 @@ NORET_TYPE void do_exit(long code) | |||
| 971 | exit_thread(); | 971 | exit_thread(); | 
| 972 | cgroup_exit(tsk, 1); | 972 | cgroup_exit(tsk, 1); | 
| 973 | 973 | ||
| 974 | if (group_dead && tsk->signal->leader) | 974 | if (group_dead) | 
| 975 | disassociate_ctty(1); | 975 | disassociate_ctty(1); | 
| 976 | 976 | ||
| 977 | module_put(task_thread_info(tsk)->exec_domain->module); | 977 | module_put(task_thread_info(tsk)->exec_domain->module); | 
| @@ -1009,7 +1009,7 @@ NORET_TYPE void do_exit(long code) | |||
| 1009 | tsk->flags |= PF_EXITPIDONE; | 1009 | tsk->flags |= PF_EXITPIDONE; | 
| 1010 | 1010 | ||
| 1011 | if (tsk->io_context) | 1011 | if (tsk->io_context) | 
| 1012 | exit_io_context(); | 1012 | exit_io_context(tsk); | 
| 1013 | 1013 | ||
| 1014 | if (tsk->splice_pipe) | 1014 | if (tsk->splice_pipe) | 
| 1015 | __free_pipe_info(tsk->splice_pipe); | 1015 | __free_pipe_info(tsk->splice_pipe); | 
| @@ -1210,6 +1210,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p) | |||
| 1210 | struct signal_struct *psig; | 1210 | struct signal_struct *psig; | 
| 1211 | struct signal_struct *sig; | 1211 | struct signal_struct *sig; | 
| 1212 | unsigned long maxrss; | 1212 | unsigned long maxrss; | 
| 1213 | cputime_t tgutime, tgstime; | ||
| 1213 | 1214 | ||
| 1214 | /* | 1215 | /* | 
| 1215 | * The resource counters for the group leader are in its | 1216 | * The resource counters for the group leader are in its | 
| @@ -1225,20 +1226,23 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p) | |||
| 1225 | * need to protect the access to parent->signal fields, | 1226 | * need to protect the access to parent->signal fields, | 
| 1226 | * as other threads in the parent group can be right | 1227 | * as other threads in the parent group can be right | 
| 1227 | * 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. | ||
| 1228 | */ | 1233 | */ | 
| 1234 | thread_group_times(p, &tgutime, &tgstime); | ||
| 1229 | spin_lock_irq(&p->real_parent->sighand->siglock); | 1235 | spin_lock_irq(&p->real_parent->sighand->siglock); | 
| 1230 | psig = p->real_parent->signal; | 1236 | psig = p->real_parent->signal; | 
| 1231 | sig = p->signal; | 1237 | sig = p->signal; | 
| 1232 | psig->cutime = | 1238 | psig->cutime = | 
| 1233 | cputime_add(psig->cutime, | 1239 | cputime_add(psig->cutime, | 
| 1234 | cputime_add(p->utime, | 1240 | cputime_add(tgutime, | 
| 1235 | cputime_add(sig->utime, | 1241 | sig->cutime)); | 
| 1236 | sig->cutime))); | ||
| 1237 | psig->cstime = | 1242 | psig->cstime = | 
| 1238 | cputime_add(psig->cstime, | 1243 | cputime_add(psig->cstime, | 
| 1239 | cputime_add(p->stime, | 1244 | cputime_add(tgstime, | 
| 1240 | cputime_add(sig->stime, | 1245 | sig->cstime)); | 
| 1241 | sig->cstime))); | ||
| 1242 | psig->cgtime = | 1246 | psig->cgtime = | 
| 1243 | cputime_add(psig->cgtime, | 1247 | cputime_add(psig->cgtime, | 
| 1244 | cputime_add(p->gtime, | 1248 | cputime_add(p->gtime, | 
