diff options
author | Jan Beulich <jbeulich@novell.com> | 2008-05-12 09:44:41 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2008-05-25 01:11:49 -0400 |
commit | a2eddfa95919a730e0e5ed17e9c303fe5ba249cd (patch) | |
tree | 19c806c27256fed0a744d8628caa356219e6bf16 | |
parent | 75d3bce2fc0a80f435fe12f2c9ed2632c8ac29e4 (diff) |
x86: make /proc/stat account for all interrupts
LAPIC interrupts, which don't go through the generic interrupt handling
code, aren't accounted for in /proc/stat. Hence this patch adds a
mechanism architectures can use to accordingly adjust the statistics.
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/x86/kernel/irq_32.c | 38 | ||||
-rw-r--r-- | arch/x86/kernel/irq_64.c | 28 | ||||
-rw-r--r-- | fs/proc/proc_misc.c | 9 | ||||
-rw-r--r-- | include/asm-x86/hardirq.h | 6 |
4 files changed, 81 insertions, 0 deletions
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 147352df28b9..468acd04aa2e 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
@@ -313,16 +313,20 @@ skip: | |||
313 | per_cpu(irq_stat,j).irq_tlb_count); | 313 | per_cpu(irq_stat,j).irq_tlb_count); |
314 | seq_printf(p, " TLB shootdowns\n"); | 314 | seq_printf(p, " TLB shootdowns\n"); |
315 | #endif | 315 | #endif |
316 | #ifdef CONFIG_X86_MCE | ||
316 | seq_printf(p, "TRM: "); | 317 | seq_printf(p, "TRM: "); |
317 | for_each_online_cpu(j) | 318 | for_each_online_cpu(j) |
318 | seq_printf(p, "%10u ", | 319 | seq_printf(p, "%10u ", |
319 | per_cpu(irq_stat,j).irq_thermal_count); | 320 | per_cpu(irq_stat,j).irq_thermal_count); |
320 | seq_printf(p, " Thermal event interrupts\n"); | 321 | seq_printf(p, " Thermal event interrupts\n"); |
322 | #endif | ||
323 | #ifdef CONFIG_X86_LOCAL_APIC | ||
321 | seq_printf(p, "SPU: "); | 324 | seq_printf(p, "SPU: "); |
322 | for_each_online_cpu(j) | 325 | for_each_online_cpu(j) |
323 | seq_printf(p, "%10u ", | 326 | seq_printf(p, "%10u ", |
324 | per_cpu(irq_stat,j).irq_spurious_count); | 327 | per_cpu(irq_stat,j).irq_spurious_count); |
325 | seq_printf(p, " Spurious interrupts\n"); | 328 | seq_printf(p, " Spurious interrupts\n"); |
329 | #endif | ||
326 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); | 330 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); |
327 | #if defined(CONFIG_X86_IO_APIC) | 331 | #if defined(CONFIG_X86_IO_APIC) |
328 | seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); | 332 | seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); |
@@ -331,6 +335,40 @@ skip: | |||
331 | return 0; | 335 | return 0; |
332 | } | 336 | } |
333 | 337 | ||
338 | /* | ||
339 | * /proc/stat helpers | ||
340 | */ | ||
341 | u64 arch_irq_stat_cpu(unsigned int cpu) | ||
342 | { | ||
343 | u64 sum = nmi_count(cpu); | ||
344 | |||
345 | #ifdef CONFIG_X86_LOCAL_APIC | ||
346 | sum += per_cpu(irq_stat, cpu).apic_timer_irqs; | ||
347 | #endif | ||
348 | #ifdef CONFIG_SMP | ||
349 | sum += per_cpu(irq_stat, cpu).irq_resched_count; | ||
350 | sum += per_cpu(irq_stat, cpu).irq_call_count; | ||
351 | sum += per_cpu(irq_stat, cpu).irq_tlb_count; | ||
352 | #endif | ||
353 | #ifdef CONFIG_X86_MCE | ||
354 | sum += per_cpu(irq_stat, cpu).irq_thermal_count; | ||
355 | #endif | ||
356 | #ifdef CONFIG_X86_LOCAL_APIC | ||
357 | sum += per_cpu(irq_stat, cpu).irq_spurious_count; | ||
358 | #endif | ||
359 | return sum; | ||
360 | } | ||
361 | |||
362 | u64 arch_irq_stat(void) | ||
363 | { | ||
364 | u64 sum = atomic_read(&irq_err_count); | ||
365 | |||
366 | #ifdef CONFIG_X86_IO_APIC | ||
367 | sum += atomic_read(&irq_mis_count); | ||
368 | #endif | ||
369 | return sum; | ||
370 | } | ||
371 | |||
334 | #ifdef CONFIG_HOTPLUG_CPU | 372 | #ifdef CONFIG_HOTPLUG_CPU |
335 | #include <mach_apic.h> | 373 | #include <mach_apic.h> |
336 | 374 | ||
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c index 3aac15466a91..1f78b238d8d2 100644 --- a/arch/x86/kernel/irq_64.c +++ b/arch/x86/kernel/irq_64.c | |||
@@ -135,6 +135,7 @@ skip: | |||
135 | seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count); | 135 | seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count); |
136 | seq_printf(p, " TLB shootdowns\n"); | 136 | seq_printf(p, " TLB shootdowns\n"); |
137 | #endif | 137 | #endif |
138 | #ifdef CONFIG_X86_MCE | ||
138 | seq_printf(p, "TRM: "); | 139 | seq_printf(p, "TRM: "); |
139 | for_each_online_cpu(j) | 140 | for_each_online_cpu(j) |
140 | seq_printf(p, "%10u ", cpu_pda(j)->irq_thermal_count); | 141 | seq_printf(p, "%10u ", cpu_pda(j)->irq_thermal_count); |
@@ -143,6 +144,7 @@ skip: | |||
143 | for_each_online_cpu(j) | 144 | for_each_online_cpu(j) |
144 | seq_printf(p, "%10u ", cpu_pda(j)->irq_threshold_count); | 145 | seq_printf(p, "%10u ", cpu_pda(j)->irq_threshold_count); |
145 | seq_printf(p, " Threshold APIC interrupts\n"); | 146 | seq_printf(p, " Threshold APIC interrupts\n"); |
147 | #endif | ||
146 | seq_printf(p, "SPU: "); | 148 | seq_printf(p, "SPU: "); |
147 | for_each_online_cpu(j) | 149 | for_each_online_cpu(j) |
148 | seq_printf(p, "%10u ", cpu_pda(j)->irq_spurious_count); | 150 | seq_printf(p, "%10u ", cpu_pda(j)->irq_spurious_count); |
@@ -153,6 +155,32 @@ skip: | |||
153 | } | 155 | } |
154 | 156 | ||
155 | /* | 157 | /* |
158 | * /proc/stat helpers | ||
159 | */ | ||
160 | u64 arch_irq_stat_cpu(unsigned int cpu) | ||
161 | { | ||
162 | u64 sum = cpu_pda(cpu)->__nmi_count; | ||
163 | |||
164 | sum += cpu_pda(cpu)->apic_timer_irqs; | ||
165 | #ifdef CONFIG_SMP | ||
166 | sum += cpu_pda(cpu)->irq_resched_count; | ||
167 | sum += cpu_pda(cpu)->irq_call_count; | ||
168 | sum += cpu_pda(cpu)->irq_tlb_count; | ||
169 | #endif | ||
170 | #ifdef CONFIG_X86_MCE | ||
171 | sum += cpu_pda(cpu)->irq_thermal_count; | ||
172 | sum += cpu_pda(cpu)->irq_threshold_count; | ||
173 | #endif | ||
174 | sum += cpu_pda(cpu)->irq_spurious_count; | ||
175 | return sum; | ||
176 | } | ||
177 | |||
178 | u64 arch_irq_stat(void) | ||
179 | { | ||
180 | return atomic_read(&irq_err_count); | ||
181 | } | ||
182 | |||
183 | /* | ||
156 | * do_IRQ handles all normal device IRQ's (the special | 184 | * do_IRQ handles all normal device IRQ's (the special |
157 | * SMP cross-CPU interrupts have their own specific | 185 | * SMP cross-CPU interrupts have their own specific |
158 | * handlers). | 186 | * handlers). |
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c index 74a323d2b850..903e617bec58 100644 --- a/fs/proc/proc_misc.c +++ b/fs/proc/proc_misc.c | |||
@@ -472,6 +472,13 @@ static const struct file_operations proc_vmalloc_operations = { | |||
472 | }; | 472 | }; |
473 | #endif | 473 | #endif |
474 | 474 | ||
475 | #ifndef arch_irq_stat_cpu | ||
476 | #define arch_irq_stat_cpu(cpu) 0 | ||
477 | #endif | ||
478 | #ifndef arch_irq_stat | ||
479 | #define arch_irq_stat() 0 | ||
480 | #endif | ||
481 | |||
475 | static int show_stat(struct seq_file *p, void *v) | 482 | static int show_stat(struct seq_file *p, void *v) |
476 | { | 483 | { |
477 | int i; | 484 | int i; |
@@ -509,7 +516,9 @@ static int show_stat(struct seq_file *p, void *v) | |||
509 | sum += temp; | 516 | sum += temp; |
510 | per_irq_sum[j] += temp; | 517 | per_irq_sum[j] += temp; |
511 | } | 518 | } |
519 | sum += arch_irq_stat_cpu(i); | ||
512 | } | 520 | } |
521 | sum += arch_irq_stat(); | ||
513 | 522 | ||
514 | seq_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu\n", | 523 | seq_printf(p, "cpu %llu %llu %llu %llu %llu %llu %llu %llu %llu\n", |
515 | (unsigned long long)cputime64_to_clock_t(user), | 524 | (unsigned long long)cputime64_to_clock_t(user), |
diff --git a/include/asm-x86/hardirq.h b/include/asm-x86/hardirq.h index 314434d664e7..000787df66e6 100644 --- a/include/asm-x86/hardirq.h +++ b/include/asm-x86/hardirq.h | |||
@@ -3,3 +3,9 @@ | |||
3 | #else | 3 | #else |
4 | # include "hardirq_64.h" | 4 | # include "hardirq_64.h" |
5 | #endif | 5 | #endif |
6 | |||
7 | extern u64 arch_irq_stat_cpu(unsigned int cpu); | ||
8 | #define arch_irq_stat_cpu arch_irq_stat_cpu | ||
9 | |||
10 | extern u64 arch_irq_stat(void); | ||
11 | #define arch_irq_stat arch_irq_stat | ||