diff options
Diffstat (limited to 'kernel/sched/cputime.c')
| -rw-r--r-- | kernel/sched/cputime.c | 28 | 
1 files changed, 28 insertions, 0 deletions
diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c index 8d859dae5be..e56f138a23c 100644 --- a/kernel/sched/cputime.c +++ b/kernel/sched/cputime.c @@ -288,6 +288,34 @@ static __always_inline bool steal_account_process_tick(void)  	return false;  } +/* + * Accumulate raw cputime values of dead tasks (sig->[us]time) and live + * tasks (sum on group iteration) belonging to @tsk's group. + */ +void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times) +{ +	struct signal_struct *sig = tsk->signal; +	struct task_struct *t; + +	times->utime = sig->utime; +	times->stime = sig->stime; +	times->sum_exec_runtime = sig->sum_sched_runtime; + +	rcu_read_lock(); +	/* make sure we can trust tsk->thread_group list */ +	if (!likely(pid_alive(tsk))) +		goto out; + +	t = tsk; +	do { +		times->utime += t->utime; +		times->stime += t->stime; +		times->sum_exec_runtime += task_sched_runtime(t); +	} while_each_thread(tsk, t); +out: +	rcu_read_unlock(); +} +  #ifndef CONFIG_VIRT_CPU_ACCOUNTING  #ifdef CONFIG_IRQ_TIME_ACCOUNTING  |