ARM: SMP: collect IPI and local timer IRQs for /proc/stat
authorRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 15 Nov 2010 14:46:46 +0000 (14:46 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 20 Dec 2010 15:08:01 +0000 (15:08 +0000)
The IPI and local timer interrupts weren't being properly accounted
for in /proc/stat.  Collect them from the irq_stat structure, and
return their sum.

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/include/asm/hardirq.h
arch/arm/kernel/smp.c

index c52e250..89ad180 100644 (file)
@@ -22,6 +22,14 @@ typedef struct {
 #define __inc_irq_stat(cpu, member)    __IRQ_STAT(cpu, member)++
 #define __get_irq_stat(cpu, member)    __IRQ_STAT(cpu, member)
 
+#ifdef CONFIG_SMP
+u64 smp_irq_stat_cpu(unsigned int cpu);
+#else
+#define smp_irq_stat_cpu(cpu)  0
+#endif
+
+#define arch_irq_stat_cpu      smp_irq_stat_cpu
+
 #if NR_IRQS > 512
 #define HARDIRQ_BITS   10
 #elif NR_IRQS > 256
index fa0c5f6..1de3e13 100644 (file)
@@ -406,6 +406,21 @@ void show_ipi_list(struct seq_file *p, int prec)
        }
 }
 
+u64 smp_irq_stat_cpu(unsigned int cpu)
+{
+       u64 sum = 0;
+       int i;
+
+       for (i = 0; i < NR_IPI; i++)
+               sum += __get_irq_stat(cpu, ipi_irqs[i]);
+
+#ifdef CONFIG_LOCAL_TIMERS
+       sum += __get_irq_stat(cpu, local_timer_irqs);
+#endif
+
+       return sum;
+}
+
 /*
  * Timer (local or broadcast) support
  */