show_interrupts() is accidentally modifying the incoming seq_file pointer. 
It goes oops if seq_printf() returns non-zero.


 arch/i386/kernel/irq.c |    9 ++++-----
 1 files changed, 4 insertions(+), 5 deletions(-)

diff -puN arch/i386/kernel/irq.c~show_interrupts-fixes arch/i386/kernel/irq.c
--- 25/arch/i386/kernel/irq.c~show_interrupts-fixes	2003-03-07 20:19:46.000000000 -0800
+++ 25-akpm/arch/i386/kernel/irq.c	2003-03-07 20:19:46.000000000 -0800
@@ -146,7 +146,7 @@ int show_interrupts(struct seq_file *p, 
 	seq_printf(p, "           ");
 	for (j=0; j<NR_CPUS; j++)
 		if (cpu_online(j))
-			p += seq_printf(p, "CPU%d       ",j);
+			seq_printf(p, "CPU%d       ",j);
 	seq_putc(p, '\n');
 
 	for (i = 0 ; i < NR_IRQS ; i++) {
@@ -160,8 +160,7 @@ int show_interrupts(struct seq_file *p, 
 #else
 		for (j = 0; j < NR_CPUS; j++)
 			if (cpu_online(j))
-				p += seq_printf(p, "%10u ",
-					     kstat_cpu(j).irqs[i]);
+				seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
 #endif
 		seq_printf(p, " %14s", irq_desc[i].handler->typename);
 		seq_printf(p, "  %s", action->name);
@@ -176,13 +175,13 @@ skip:
 	seq_printf(p, "NMI: ");
 	for (j = 0; j < NR_CPUS; j++)
 		if (cpu_online(j))
-			p += seq_printf(p, "%10u ", nmi_count(j));
+			seq_printf(p, "%10u ", nmi_count(j));
 	seq_putc(p, '\n');
 #if CONFIG_X86_LOCAL_APIC
 	seq_printf(p, "LOC: ");
 	for (j = 0; j < NR_CPUS; j++)
 		if (cpu_online(j))
-			p += seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
+			seq_printf(p, "%10u ", irq_stat[j].apic_timer_irqs);
 	seq_putc(p, '\n');
 #endif
 	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));

_