Index: 2.6.12/include/linux/sched_cpustats.h =================================================================== --- 2.6.12.orig/include/linux/sched_cpustats.h 2005-07-22 09:09:17.000000000 -0500 +++ 2.6.12/include/linux/sched_cpustats.h 2005-07-23 11:34:47.000000000 -0500 @@ -25,6 +25,7 @@ unsigned long long total_rt_intr_delay; unsigned long long total_fork_delay; unsigned long long total_sinbin; + unsigned long long total_latency; }; extern DEFINE_PER_CPU(struct runq_cpustats, cpustats_runqs); @@ -41,6 +42,7 @@ unsigned long long avg_cpu_per_cycle; unsigned long long total_delay; unsigned long long avg_delay_per_cycle; + unsigned long long total_latency; unsigned long long total_sinbin; unsigned long long avg_cycle_length; unsigned long cpu_usage_rate; @@ -48,7 +50,8 @@ }; #define CPUSTATS_WOKEN_FOR_INTR_FL (1 << 0) -#define CPUSTATS_JUST_FORKED_FL (1 << 1) +#define CPUSTATS_JUST_WOKEN_FL (1 << 1) +#define CPUSTATS_JUST_FORKED_FL (1 << 2) #define INIT_CPUSTATS \ .cpustats = { 0, }, \ @@ -99,6 +102,7 @@ unsigned long long total_intr_delay; unsigned long long total_rt_intr_delay; unsigned long long total_fork_delay; + unsigned long long total_latency; unsigned long long total_sinbin; unsigned long long nr_switches; }; Index: 2.6.12/kernel/sched_cpustats.c =================================================================== --- 2.6.12.orig/kernel/sched_cpustats.c 2005-07-22 09:09:17.000000000 -0500 +++ 2.6.12/kernel/sched_cpustats.c 2005-07-23 11:34:47.000000000 -0500 @@ -38,6 +38,7 @@ csrq->total_intr_delay = 0; csrq->total_rt_intr_delay = 0; csrq->total_fork_delay = 0; + csrq->total_latency = 0; cpu_rq(cpu)->timestamp_last_tick = INITIAL_CPUSTATS_TIMESTAMP; } @@ -59,6 +60,7 @@ TASK_CPUSTATS(p).total_cpu = 0; TASK_CPUSTATS(p).total_wake_ups = 0; TASK_CPUSTATS(p).intr_wake_ups = 0; + TASK_CPUSTATS(p).total_latency = 0; TASK_CPUSTATS(p).avg_cycle_length = 0; p->timestamp = now; TASK_CPUSTATS(p).flags = CPUSTATS_JUST_FORKED_FL; @@ -123,9 +125,13 @@ rq_stats->total_fork_delay += delta; TASK_CPUSTATS(p).flags &= ~CPUSTATS_JUST_FORKED_FL; } - if (TASK_CPUSTATS(p).flags & CPUSTATS_WOKEN_FOR_INTR_FL) { - rq_stats->total_intr_delay += delta; - TASK_CPUSTATS(p).flags &= ~CPUSTATS_WOKEN_FOR_INTR_FL; + if (TASK_CPUSTATS(p).flags & CPUSTATS_JUST_WOKEN_FL) { + rq_stats->total_latency += delta; + TASK_CPUSTATS(p).total_latency += delta; + if (TASK_CPUSTATS(p).flags & CPUSTATS_WOKEN_FOR_INTR_FL) + rq_stats->total_intr_delay += delta; + TASK_CPUSTATS(p).flags &= + ~(CPUSTATS_WOKEN_FOR_INTR_FL|CPUSTATS_JUST_WOKEN_FL); } } @@ -154,6 +160,7 @@ void update_cpustats_at_wake_up(struct task_struct *p, unsigned long long now) { delta_sleep_cpustats(p, now); + TASK_CPUSTATS(p).flags |= CPUSTATS_JUST_WOKEN_FL; if (in_interrupt()) { TASK_CPUSTATS(p).intr_wake_ups++; TASK_CPUSTATS(p).flags |= CPUSTATS_WOKEN_FOR_INTR_FL; @@ -183,13 +190,14 @@ if (result) return sprintf(buffer, "Data unavailable\n"); return sprintf(buffer, - "%llu (%llu) %llu (%llu) %llu (%llu) %llu %llu %llu %lu %lu @ %llu\n", + "%llu (%llu) %llu (%llu) %llu (%llu) %llu %llu %llu %llu %lu %lu @ %llu\n", stats.total_sleep, SCHED_AVG_RND(stats.avg_sleep_per_cycle), stats.total_cpu, SCHED_AVG_RND(stats.avg_cpu_per_cycle), stats.total_delay, SCHED_AVG_RND(stats.avg_delay_per_cycle), + stats.total_latency, stats.total_sinbin, stats.total_wake_ups, stats.intr_wake_ups, @@ -214,13 +222,14 @@ break; } len += sprintf(page + len, - "cpu%02d %llu %llu %llu %llu %llu %llu %llu %llu @ %llu\n", i, + "cpu%02d %llu %llu %llu %llu %llu %llu %llu %llu %llu @ %llu\n", i, stats.total_idle, stats.total_busy, stats.total_delay, stats.total_rt_delay, stats.total_intr_delay, stats.total_rt_intr_delay, + stats.total_latency, stats.total_sinbin, stats.nr_switches, stats.timestamp); @@ -230,17 +239,19 @@ total.total_rt_delay += stats.total_rt_delay; total.total_intr_delay += stats.total_intr_delay; total.total_rt_intr_delay += stats.total_rt_intr_delay; + total.total_latency += stats.total_latency; total.total_sinbin += stats.total_sinbin; total.nr_switches += stats.nr_switches; } if (avail) - len += sprintf(page + len, "total %llu %llu %llu %llu %llu %llu %llu %llu\n", + len += sprintf(page + len, "total %llu %llu %llu %llu %llu %llu %llu %llu %llu\n", total.total_idle, total.total_busy, total.total_delay, total.total_intr_delay, total.total_rt_delay, total.total_rt_intr_delay, + total.total_latency, total.total_sinbin, total.nr_switches); else Index: 2.6.12/kernel/sched_spa.c =================================================================== --- 2.6.12.orig/kernel/sched_spa.c 2005-07-23 11:34:17.000000000 -0500 +++ 2.6.12/kernel/sched_spa.c 2005-07-25 15:23:58.000000000 -0500 @@ -522,9 +522,10 @@ return; get_task_cpustats(p, &stats, ×tamp); - printk("SCHED_EXIT[%d] (%s) %llu %llu %llu %llu %llu %llu %lu %lu @ %llu\n", + printk("SCHED_EXIT[%d] (%s) %llu %llu %llu %llu %llu %llu %llu %lu %lu @ %llu\n", p->pid, p->comm, stats.total_sleep, stats.total_cpu, stats.total_delay, + stats.total_latency, stats.total_sinbin, stats.total_wake_ups, stats.intr_wake_ups, p->nvcsw, p->nivcsw, timestamp); } @@ -1153,6 +1154,8 @@ stats->avg_delay_per_cycle += delta; if (is_sinbinned) stats->total_sinbin += delta; + if (stats->flags & CPUSTATS_JUST_WOKEN_FL) + stats->total_latency += delta; } else { stats->total_sleep += delta; stats->avg_sleep_per_cycle += delta; @@ -1206,6 +1209,7 @@ stats->total_rt_intr_delay = csrq->total_rt_intr_delay; stats->total_fork_delay = csrq->total_fork_delay; stats->total_sinbin = csrq->total_sinbin; + stats->total_latency = csrq->total_latency; stats->nr_switches = rq->nr_switches; spin_unlock_irq(&rq->lock); @@ -1436,10 +1440,11 @@ total.total_rt_intr_delay += stats.total_rt_intr_delay; total.total_fork_delay += stats.total_fork_delay; total.total_sinbin += stats.total_sinbin; + total.total_latency += stats.total_latency; total.nr_switches += stats.nr_switches; } if (avail) - len = sprintf(page, "%llu %llu %llu %llu %llu %llu %llu %llu %llu @ %llu\n", + len = sprintf(page, "%llu %llu %llu %llu %llu %llu %llu %llu %llu %llu @ %llu\n", total.total_idle, total.total_busy, total.total_delay, @@ -1447,6 +1452,7 @@ total.total_rt_delay, total.total_rt_intr_delay, total.total_fork_delay, + total.total_latency, total.total_sinbin, total.nr_switches, timestamp);