From: Kingsley Cheung <kingsley@aurema.com>



---

 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;

_