Commit 9c2c4802 authored by Ken Chen's avatar Ken Chen Committed by Ingo Molnar

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: default avatarKen Chen <kenchen@google.com>
Acked-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent e9515c3c
...@@ -347,7 +347,7 @@ static int proc_pid_wchan(struct task_struct *task, char *buffer) ...@@ -347,7 +347,7 @@ static int proc_pid_wchan(struct task_struct *task, char *buffer)
static int proc_pid_schedstat(struct task_struct *task, char *buffer) static int proc_pid_schedstat(struct task_struct *task, char *buffer)
{ {
return sprintf(buffer, "%llu %llu %lu\n", return sprintf(buffer, "%llu %llu %lu\n",
task->sched_info.cpu_time, task->se.sum_exec_runtime,
task->sched_info.run_delay, task->sched_info.run_delay,
task->sched_info.pcount); task->sched_info.pcount);
} }
......
...@@ -670,8 +670,7 @@ struct reclaim_state; ...@@ -670,8 +670,7 @@ struct reclaim_state;
struct sched_info { struct sched_info {
/* cumulative counters */ /* cumulative counters */
unsigned long pcount; /* # of times run on this cpu */ unsigned long pcount; /* # of times run on this cpu */
unsigned long long cpu_time, /* time spent on the cpu */ unsigned long long run_delay; /* time spent waiting on a runqueue */
run_delay; /* time spent waiting on a runqueue */
/* timestamps */ /* timestamps */
unsigned long long last_arrival,/* when we last ran on a cpu */ unsigned long long last_arrival,/* when we last ran on a cpu */
......
...@@ -127,7 +127,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) ...@@ -127,7 +127,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
*/ */
t1 = tsk->sched_info.pcount; t1 = tsk->sched_info.pcount;
t2 = tsk->sched_info.run_delay; t2 = tsk->sched_info.run_delay;
t3 = tsk->sched_info.cpu_time; t3 = tsk->se.sum_exec_runtime;
d->cpu_count += t1; d->cpu_count += t1;
......
...@@ -596,6 +596,8 @@ struct rq { ...@@ -596,6 +596,8 @@ struct rq {
#ifdef CONFIG_SCHEDSTATS #ifdef CONFIG_SCHEDSTATS
/* latency stats */ /* latency stats */
struct sched_info rq_sched_info; struct sched_info rq_sched_info;
unsigned long long rq_cpu_time;
/* could above be rq->cfs_rq.exec_clock + rq->rt_rq.rt_runtime ? */
/* sys_sched_yield() stats */ /* sys_sched_yield() stats */
unsigned int yld_exp_empty; unsigned int yld_exp_empty;
......
...@@ -31,7 +31,7 @@ static int show_schedstat(struct seq_file *seq, void *v) ...@@ -31,7 +31,7 @@ static int show_schedstat(struct seq_file *seq, void *v)
rq->yld_act_empty, rq->yld_exp_empty, rq->yld_count, rq->yld_act_empty, rq->yld_exp_empty, rq->yld_count,
rq->sched_switch, rq->sched_count, rq->sched_goidle, rq->sched_switch, rq->sched_count, rq->sched_goidle,
rq->ttwu_count, rq->ttwu_local, rq->ttwu_count, rq->ttwu_local,
rq->rq_sched_info.cpu_time, rq->rq_cpu_time,
rq->rq_sched_info.run_delay, rq->rq_sched_info.pcount); rq->rq_sched_info.run_delay, rq->rq_sched_info.pcount);
seq_printf(seq, "\n"); seq_printf(seq, "\n");
...@@ -123,7 +123,7 @@ static inline void ...@@ -123,7 +123,7 @@ static inline void
rq_sched_info_depart(struct rq *rq, unsigned long long delta) rq_sched_info_depart(struct rq *rq, unsigned long long delta)
{ {
if (rq) if (rq)
rq->rq_sched_info.cpu_time += delta; rq->rq_cpu_time += delta;
} }
static inline void static inline void
...@@ -236,7 +236,6 @@ static inline void sched_info_depart(struct task_struct *t) ...@@ -236,7 +236,6 @@ static inline void sched_info_depart(struct task_struct *t)
unsigned long long delta = task_rq(t)->clock - unsigned long long delta = task_rq(t)->clock -
t->sched_info.last_arrival; t->sched_info.last_arrival;
t->sched_info.cpu_time += delta;
rq_sched_info_depart(task_rq(t), delta); rq_sched_info_depart(task_rq(t), delta);
if (t->state == TASK_RUNNING) if (t->state == TASK_RUNNING)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment