Commit 9c2c48020ec0dd6ecd27e5a1298f73b40d85a595
Committed by
Ingo Molnar
1 parent
e9515c3c9f
Exists in
master
and in
4 other branches
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
fs/proc/base.c
... | ... | @@ -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 */ |
kernel/delayacct.c
kernel/sched.c
... | ... | @@ -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) |