diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/i386/kernel/apic.c x/arch/i386/kernel/apic.c
--- x-ref/arch/i386/kernel/apic.c	2003-09-23 01:51:35.000000000 +0200
+++ x/arch/i386/kernel/apic.c	2003-09-23 01:51:37.000000000 +0200
@@ -1086,7 +1086,6 @@ inline void smp_local_timer_interrupt(st
  * [ if a single-CPU system runs an SMP kernel then we call the local
  *   interrupt as well. Thus we cannot inline the local irq ... ]
  */
-unsigned int apic_timer_irqs [NR_CPUS];
 
 void smp_apic_timer_interrupt(struct pt_regs * regs)
 {
@@ -1095,7 +1094,7 @@ void smp_apic_timer_interrupt(struct pt_
 	/*
 	 * the NMI deadlock-detector uses this.
 	 */
-	apic_timer_irqs[cpu]++;
+	irq_stat[cpu].apic_timer_irqs++;
 
 	/*
 	 * NOTE! We'd better ACK the irq immediately,
diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/i386/kernel/irq.c x/arch/i386/kernel/irq.c
--- x-ref/arch/i386/kernel/irq.c	2003-09-23 01:51:33.000000000 +0200
+++ x/arch/i386/kernel/irq.c	2003-09-23 01:52:07.000000000 +0200
@@ -170,7 +170,7 @@ int show_interrupts(struct seq_file *p, 
 	seq_printf(p, "LOC: ");
 	for (j = 0; j < smp_num_cpus; j++)
 		seq_printf(p, "%10u ",
-			apic_timer_irqs[cpu_logical_map(j)]);
+			irq_stat[cpu_logical_map(j)].apic_timer_irqs);
 	seq_printf(p, "\n");
 #endif
 	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/i386/kernel/nmi.c x/arch/i386/kernel/nmi.c
--- x-ref/arch/i386/kernel/nmi.c	2003-06-13 22:07:23.000000000 +0200
+++ x/arch/i386/kernel/nmi.c	2003-09-23 01:51:37.000000000 +0200
@@ -346,7 +346,7 @@ void nmi_watchdog_tick (struct pt_regs *
 	 */
 	int sum, cpu = smp_processor_id();
 
-	sum = apic_timer_irqs[cpu];
+	sum = irq_stat[cpu].apic_timer_irqs;
 
 	if (last_irq_sums[cpu] == sum) {
 		/*
diff -urNp --exclude CVS --exclude BitKeeper x-ref/arch/ia64/kernel/irq.c x/arch/ia64/kernel/irq.c
--- x-ref/arch/ia64/kernel/irq.c	2003-09-23 01:51:33.000000000 +0200
+++ x/arch/ia64/kernel/irq.c	2003-09-23 01:51:37.000000000 +0200
@@ -193,7 +193,7 @@ int get_irq_list(char *buf)
 	p += sprintf(p, "LOC: ");
 	for (j = 0; j < smp_num_cpus; j++)
 		p += sprintf(p, "%10u ",
-			apic_timer_irqs[cpu_logical_map(j)]);
+			irq_stat[cpu_logical_map(j)].apic_timer_irqs);
 	p += sprintf(p, "\n");
 #endif
 	p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-i386/apic.h x/include/asm-i386/apic.h
--- x-ref/include/asm-i386/apic.h	2003-07-18 06:07:45.000000000 +0200
+++ x/include/asm-i386/apic.h	2003-09-23 01:51:37.000000000 +0200
@@ -85,7 +85,6 @@ extern void enable_APIC_timer(void);
 extern struct pm_dev *apic_pm_register(pm_dev_t, unsigned long, pm_callback);
 extern void apic_pm_unregister(struct pm_dev*);
 
-extern unsigned int apic_timer_irqs [NR_CPUS];
 extern int check_nmi_watchdog (void);
 
 extern unsigned int nmi_watchdog;
diff -urNp --exclude CVS --exclude BitKeeper x-ref/include/asm-i386/hardirq.h x/include/asm-i386/hardirq.h
--- x-ref/include/asm-i386/hardirq.h	2003-09-22 08:05:01.000000000 +0200
+++ x/include/asm-i386/hardirq.h	2003-09-23 01:51:37.000000000 +0200
@@ -13,6 +13,9 @@ typedef struct {
 	unsigned int __syscall_count;
 	struct task_struct * __ksoftirqd_task; /* waitqueue is too large */
 	unsigned int __nmi_count;	/* arch dependent */
+#if CONFIG_X86_LOCAL_APIC 	
+	unsigned int apic_timer_irqs;	/* arch dependent */
+#endif
 } ____cacheline_aligned irq_cpustat_t;
 
 #include <linux/irq_cpustat.h>	/* Standard mappings for irq_cpustat_t above */