|
@@ -91,8 +91,6 @@ static void __exit_signal(struct task_struct *tsk)
|
|
|
if (atomic_dec_and_test(&sig->count))
|
|
|
posix_cpu_timers_exit_group(tsk);
|
|
|
else {
|
|
|
- cputime_t utime, stime;
|
|
|
-
|
|
|
/*
|
|
|
* If there is any task waiting for the group exit
|
|
|
* then notify it:
|
|
@@ -112,9 +110,8 @@ static void __exit_signal(struct task_struct *tsk)
|
|
|
* We won't ever get here for the group leader, since it
|
|
|
* will have been the last reference on the signal_struct.
|
|
|
*/
|
|
|
- task_times(tsk, &utime, &stime);
|
|
|
- sig->utime = cputime_add(sig->utime, utime);
|
|
|
- sig->stime = cputime_add(sig->stime, stime);
|
|
|
+ sig->utime = cputime_add(sig->utime, tsk->utime);
|
|
|
+ sig->stime = cputime_add(sig->stime, tsk->stime);
|
|
|
sig->gtime = cputime_add(sig->gtime, tsk->gtime);
|
|
|
sig->min_flt += tsk->min_flt;
|
|
|
sig->maj_flt += tsk->maj_flt;
|
|
@@ -1208,6 +1205,7 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
|
|
|
struct signal_struct *psig;
|
|
|
struct signal_struct *sig;
|
|
|
unsigned long maxrss;
|
|
|
+ cputime_t tgutime, tgstime;
|
|
|
|
|
|
/*
|
|
|
* The resource counters for the group leader are in its
|
|
@@ -1223,20 +1221,23 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
|
|
|
* need to protect the access to parent->signal fields,
|
|
|
* as other threads in the parent group can be right
|
|
|
* here reaping other children at the same time.
|
|
|
+ *
|
|
|
+ * We use thread_group_times() to get times for the thread
|
|
|
+ * group, which consolidates times for all threads in the
|
|
|
+ * group including the group leader.
|
|
|
*/
|
|
|
+ thread_group_times(p, &tgutime, &tgstime);
|
|
|
spin_lock_irq(&p->real_parent->sighand->siglock);
|
|
|
psig = p->real_parent->signal;
|
|
|
sig = p->signal;
|
|
|
psig->cutime =
|
|
|
cputime_add(psig->cutime,
|
|
|
- cputime_add(p->utime,
|
|
|
- cputime_add(sig->utime,
|
|
|
- sig->cutime)));
|
|
|
+ cputime_add(tgutime,
|
|
|
+ sig->cutime));
|
|
|
psig->cstime =
|
|
|
cputime_add(psig->cstime,
|
|
|
- cputime_add(p->stime,
|
|
|
- cputime_add(sig->stime,
|
|
|
- sig->cstime)));
|
|
|
+ cputime_add(tgstime,
|
|
|
+ sig->cstime));
|
|
|
psig->cgtime =
|
|
|
cputime_add(psig->cgtime,
|
|
|
cputime_add(p->gtime,
|