diff -urN oldtree/fs/proc/base.c newtree/fs/proc/base.c --- oldtree/fs/proc/base.c 2006-09-24 17:03:56.000000000 -0400 +++ newtree/fs/proc/base.c 2006-09-26 14:32:48.000000000 -0400 @@ -294,10 +294,13 @@ */ static int proc_pid_schedstat(struct task_struct *task, char *buffer) { - return sprintf(buffer, "%lu %lu %lu\n", + int ret = sprintf(buffer, "%lu %lu %lu %lu\n", task->sched_info.cpu_time, task->sched_info.run_delay, + task->sched_info.max_delay, task->sched_info.pcnt); + task->sched_info.max_delay = 0; + return ret; } #endif diff -urN oldtree/include/linux/sched.h newtree/include/linux/sched.h --- oldtree/include/linux/sched.h 2006-09-26 14:32:04.000000000 -0400 +++ newtree/include/linux/sched.h 2006-09-26 14:32:48.000000000 -0400 @@ -586,6 +586,7 @@ /* cumulative counters */ unsigned long cpu_time, /* time spent on the cpu */ run_delay, /* time spent waiting on a runqueue */ + max_delay, /* max time spent waiting on a runq */ pcnt; /* # of timeslices run on this cpu */ /* timestamps */ diff -urN oldtree/kernel/sched_ingosched.c newtree/kernel/sched_ingosched.c --- oldtree/kernel/sched_ingosched.c 2006-09-24 17:45:53.000000000 -0400 +++ newtree/kernel/sched_ingosched.c 2006-09-26 14:32:52.000000000 -0400 @@ -441,6 +441,7 @@ rq->sched_switch, rq->sched_cnt, rq->sched_goidle, rq->ttwu_cnt, rq->ttwu_local, rq->rq_sched_info.cpu_time, + rq->rq_sched_info.max_delay, rq->rq_sched_info.run_delay, rq->rq_sched_info.pcnt); seq_printf(seq, "\n"); @@ -511,6 +512,7 @@ rq_sched_info_arrive(struct rq *rq, unsigned long delta_jiffies) { if (rq) { + rq->rq_sched_info.max_delay = max(rq->rq_sched_info.max_delay, delta_jiffies); rq->rq_sched_info.run_delay += delta_jiffies; rq->rq_sched_info.pcnt++; } @@ -586,6 +588,7 @@ if (t->sched_info.last_queued) delta_jiffies = now - t->sched_info.last_queued; sched_info_dequeued(t); + t->sched_info.max_delay = max(t->sched_info.max_delay, delta_jiffies); t->sched_info.run_delay += delta_jiffies; t->sched_info.last_arrival = now; t->sched_info.pcnt++; diff -urN oldtree/kernel/sched_staircase.c newtree/kernel/sched_staircase.c --- oldtree/kernel/sched_staircase.c 2006-09-26 14:32:04.000000000 -0400 +++ newtree/kernel/sched_staircase.c 2006-09-26 14:32:52.000000000 -0400 @@ -364,6 +364,7 @@ rq->sched_switch, rq->sched_cnt, rq->sched_goidle, rq->ttwu_cnt, rq->ttwu_local, rq->rq_sched_info.cpu_time, + rq->rq_sched_info.max_delay, rq->rq_sched_info.run_delay, rq->rq_sched_info.pcnt); seq_printf(seq, "\n"); @@ -434,6 +435,7 @@ rq_sched_info_arrive(struct rq *rq, unsigned long delta_jiffies) { if (rq) { + rq->rq_sched_info.max_delay = max(rq->rq_sched_info.max_delay, delta_jiffies); rq->rq_sched_info.run_delay += delta_jiffies; rq->rq_sched_info.pcnt++; } @@ -503,6 +505,7 @@ if (t->sched_info.last_queued) delta_jiffies = now - t->sched_info.last_queued; sched_info_dequeued(t); + t->sched_info.max_delay = max(t->sched_info.max_delay, diff); t->sched_info.run_delay += delta_jiffies; t->sched_info.last_arrival = now; t->sched_info.pcnt++;