|
@@ -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
|