Browse Source

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>
Ken Chen 16 years ago
parent
commit
9c2c48020e
5 changed files with 7 additions and 7 deletions
  1. 1 1
      fs/proc/base.c
  2. 1 2
      include/linux/sched.h
  3. 1 1
      kernel/delayacct.c
  4. 2 0
      kernel/sched.c
  5. 2 3
      kernel/sched_stats.h

+ 1 - 1
fs/proc/base.c

@@ -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);
 }
 }

+ 1 - 2
include/linux/sched.h

@@ -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 */
-			   run_delay; /* time spent waiting on a runqueue */
+	unsigned long long 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 */

+ 1 - 1
kernel/delayacct.c

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

+ 2 - 0
kernel/sched.c

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

+ 2 - 3
kernel/sched_stats.h

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