Commit 9c2c48020ec0dd6ecd27e5a1298f73b40d85a595

Authored by Ken Chen
Committed by Ingo Molnar
1 parent e9515c3c9f

schedstat: consolidate per-task cpu runtime stats

Impact: simplify code

When we turn on CONFIG_SCHEDSTATS, per-task cpu runtime is accumulated
twice. Once in task->se.sum_exec_runtime and once in sched_info.cpu_time.
These two stats are exactly the same.

Given that task->se.sum_exec_runtime is always accumulated by the core
scheduler, sched_info can reuse that data instead of duplicate the accounting.

Signed-off-by: Ken Chen <kenchen@google.com>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>

Showing 5 changed files with 7 additions and 7 deletions Side-by-side Diff

... ... @@ -347,7 +347,7 @@
347 347 static int proc_pid_schedstat(struct task_struct *task, char *buffer)
348 348 {
349 349 return sprintf(buffer, "%llu %llu %lu\n",
350   - task->sched_info.cpu_time,
  350 + task->se.sum_exec_runtime,
351 351 task->sched_info.run_delay,
352 352 task->sched_info.pcount);
353 353 }
include/linux/sched.h
... ... @@ -670,8 +670,7 @@
670 670 struct sched_info {
671 671 /* cumulative counters */
672 672 unsigned long pcount; /* # of times run on this cpu */
673   - unsigned long long cpu_time, /* time spent on the cpu */
674   - run_delay; /* time spent waiting on a runqueue */
  673 + unsigned long long run_delay; /* time spent waiting on a runqueue */
675 674  
676 675 /* timestamps */
677 676 unsigned long long last_arrival,/* when we last ran on a cpu */
... ... @@ -127,7 +127,7 @@
127 127 */
128 128 t1 = tsk->sched_info.pcount;
129 129 t2 = tsk->sched_info.run_delay;
130   - t3 = tsk->sched_info.cpu_time;
  130 + t3 = tsk->se.sum_exec_runtime;
131 131  
132 132 d->cpu_count += t1;
133 133  
... ... @@ -596,6 +596,8 @@
596 596 #ifdef CONFIG_SCHEDSTATS
597 597 /* latency stats */
598 598 struct sched_info rq_sched_info;
  599 + unsigned long long rq_cpu_time;
  600 + /* could above be rq->cfs_rq.exec_clock + rq->rt_rq.rt_runtime ? */
599 601  
600 602 /* sys_sched_yield() stats */
601 603 unsigned int yld_exp_empty;
kernel/sched_stats.h
... ... @@ -31,7 +31,7 @@
31 31 rq->yld_act_empty, rq->yld_exp_empty, rq->yld_count,
32 32 rq->sched_switch, rq->sched_count, rq->sched_goidle,
33 33 rq->ttwu_count, rq->ttwu_local,
34   - rq->rq_sched_info.cpu_time,
  34 + rq->rq_cpu_time,
35 35 rq->rq_sched_info.run_delay, rq->rq_sched_info.pcount);
36 36  
37 37 seq_printf(seq, "\n");
... ... @@ -123,7 +123,7 @@
123 123 rq_sched_info_depart(struct rq *rq, unsigned long long delta)
124 124 {
125 125 if (rq)
126   - rq->rq_sched_info.cpu_time += delta;
  126 + rq->rq_cpu_time += delta;
127 127 }
128 128  
129 129 static inline void
... ... @@ -236,7 +236,6 @@
236 236 unsigned long long delta = task_rq(t)->clock -
237 237 t->sched_info.last_arrival;
238 238  
239   - t->sched_info.cpu_time += delta;
240 239 rq_sched_info_depart(task_rq(t), delta);
241 240  
242 241 if (t->state == TASK_RUNNING)