#ifdef CONFIG_LOCAL_TIMERS
        unsigned int local_timer_irqs;
 #endif
+#ifdef CONFIG_SMP
+       unsigned int ipi_irqs;
+#endif
 } ____cacheline_aligned irq_cpustat_t;
 
 #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
 
  */
 struct secondary_data secondary_data;
 
-/*
- * structures for inter-processor calls
- */
-struct ipi_data {
-       unsigned long ipi_count;
-};
-
-static DEFINE_PER_CPU(struct ipi_data, ipi_data);
-
 enum ipi_msg_type {
        IPI_TIMER = 2,
        IPI_RESCHEDULE,
        seq_puts(p, "IPI:");
 
        for_each_present_cpu(cpu)
-               seq_printf(p, " %10lu", per_cpu(ipi_data, cpu).ipi_count);
+               seq_printf(p, " %10u", __get_irq_stat(cpu, ipi_irqs));
 
        seq_putc(p, '\n');
 }
 asmlinkage void __exception do_IPI(int ipinr, struct pt_regs *regs)
 {
        unsigned int cpu = smp_processor_id();
-       struct ipi_data *ipi = &per_cpu(ipi_data, cpu);
        struct pt_regs *old_regs = set_irq_regs(regs);
 
-       ipi->ipi_count++;
+       __inc_irq_stat(cpu, ipi_irqs);
 
        switch (ipinr) {
        case IPI_TIMER: