From: Kingsley Cheung --- fs/proc/proc_misc.c | 48 ++++++++++++++++++++++++++------------------ include/linux/kernel_stat.h | 16 +++++++------- kernel/sched.c | 9 ++++---- 3 files changed, 42 insertions(+), 31 deletions(-) diff -puN fs/proc/proc_misc.c~sched-stats-64-bit fs/proc/proc_misc.c --- 25/fs/proc/proc_misc.c~sched-stats-64-bit 2004-03-09 18:19:34.000000000 -0800 +++ 25-akpm/fs/proc/proc_misc.c 2004-03-09 18:39:02.000000000 -0800 @@ -361,7 +361,8 @@ int show_stat(struct seq_file *p, void * int i; extern unsigned long total_forks; unsigned long jif; - unsigned int sum = 0, user = 0, nice = 0, system = 0, idle = 0, iowait = 0, irq = 0, softirq = 0; + u64 sum = 0, user = 0, nice = 0, system = 0, + idle = 0, iowait = 0, irq = 0, softirq = 0; jif = - wall_to_monotonic.tv_sec; if (wall_to_monotonic.tv_nsec) @@ -381,26 +382,35 @@ int show_stat(struct seq_file *p, void * sum += kstat_cpu(i).irqs[j]; } - seq_printf(p, "cpu %u %u %u %u %u %u %u\n", - jiffies_to_clock_t(user), - jiffies_to_clock_t(nice), - jiffies_to_clock_t(system), - jiffies_to_clock_t(idle), - jiffies_to_clock_t(iowait), - jiffies_to_clock_t(irq), - jiffies_to_clock_t(softirq)); + seq_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu\n", + jiffies_64_to_clock_t(user), + jiffies_64_to_clock_t(nice), + jiffies_64_to_clock_t(system), + jiffies_64_to_clock_t(idle), + jiffies_64_to_clock_t(iowait), + jiffies_64_to_clock_t(irq), + jiffies_64_to_clock_t(softirq)); for_each_cpu(i) { - seq_printf(p, "cpu%d %u %u %u %u %u %u %u\n", + /* two separate calls here to work around gcc-2.95.3 ICE */ + seq_printf(p, "cpu%d %llu %llu %llu ", i, - jiffies_to_clock_t(kstat_cpu(i).cpustat.user), - jiffies_to_clock_t(kstat_cpu(i).cpustat.nice), - jiffies_to_clock_t(kstat_cpu(i).cpustat.system), - jiffies_to_clock_t(kstat_cpu(i).cpustat.idle), - jiffies_to_clock_t(kstat_cpu(i).cpustat.iowait), - jiffies_to_clock_t(kstat_cpu(i).cpustat.irq), - jiffies_to_clock_t(kstat_cpu(i).cpustat.softirq)); + (unsigned long long) + jiffies_64_to_clock_t(kstat_cpu(i).cpustat.user), + (unsigned long long) + jiffies_64_to_clock_t(kstat_cpu(i).cpustat.nice), + (unsigned long long) + jiffies_64_to_clock_t(kstat_cpu(i).cpustat.system)); + seq_printf(p, "%llu %llu %llu %llu\n", + (unsigned long long) + jiffies_64_to_clock_t(kstat_cpu(i).cpustat.idle), + (unsigned long long) + jiffies_64_to_clock_t(kstat_cpu(i).cpustat.iowait), + (unsigned long long) + jiffies_64_to_clock_t(kstat_cpu(i).cpustat.irq), + (unsigned long long) + jiffies_64_to_clock_t(kstat_cpu(i).cpustat.softirq)); } - seq_printf(p, "intr %u", sum); + seq_printf(p, "intr %llu", sum); #if !defined(CONFIG_PPC64) && !defined(CONFIG_ALPHA) for (i = 0; i < NR_IRQS; i++) @@ -408,7 +418,7 @@ int show_stat(struct seq_file *p, void * #endif seq_printf(p, - "\nctxt %lu\n" + "\nctxt %llu\n" "btime %lu\n" "processes %lu\n" "procs_running %lu\n" diff -puN include/linux/kernel_stat.h~sched-stats-64-bit include/linux/kernel_stat.h --- 25/include/linux/kernel_stat.h~sched-stats-64-bit 2004-03-09 18:19:34.000000000 -0800 +++ 25-akpm/include/linux/kernel_stat.h 2004-03-09 18:19:34.000000000 -0800 @@ -14,13 +14,13 @@ */ struct cpu_usage_stat { - unsigned int user; - unsigned int nice; - unsigned int system; - unsigned int softirq; - unsigned int irq; - unsigned int idle; - unsigned int iowait; + u64 user; + u64 nice; + u64 system; + u64 softirq; + u64 irq; + u64 idle; + u64 iowait; }; struct kernel_stat { @@ -34,7 +34,7 @@ DECLARE_PER_CPU(struct kernel_stat, ksta /* Must have preemption disabled for this to be meaningful. */ #define kstat_this_cpu __get_cpu_var(kstat) -extern unsigned long nr_context_switches(void); +extern unsigned long long nr_context_switches(void); /* * Number of interrupts per specific IRQ source, since bootup diff -puN kernel/sched.c~sched-stats-64-bit kernel/sched.c --- 25/kernel/sched.c~sched-stats-64-bit 2004-03-09 18:19:34.000000000 -0800 +++ 25-akpm/kernel/sched.c 2004-03-09 18:38:54.000000000 -0800 @@ -201,8 +201,9 @@ struct prio_array { */ struct runqueue { spinlock_t lock; - unsigned long nr_running, nr_switches, expired_timestamp, - nr_uninterruptible, timestamp_last_tick; + unsigned long long nr_switches; + unsigned long nr_running, expired_timestamp, nr_uninterruptible, + timestamp_last_tick; task_t *curr, *idle; struct mm_struct *prev_mm; prio_array_t *active, *expired, arrays[2]; @@ -950,9 +951,9 @@ unsigned long nr_uninterruptible(void) return sum; } -unsigned long nr_context_switches(void) +unsigned long long nr_context_switches(void) { - unsigned long i, sum = 0; + unsigned long long i, sum = 0; for_each_cpu(i) sum += cpu_rq(i)->nr_switches; _