aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/irq_32.c
diff options
context:
space:
mode:
authorJoe Korty <joe.korty@ccur.com>2007-10-17 12:04:40 -0400
committerThomas Gleixner <tglx@inhelltoy.tec.linutronix.de>2007-10-17 14:16:53 -0400
commit38e760a1335ffaca5a08624a9aed6fe2055c2c98 (patch)
treec313888b750a56db7c9c09c8af5be830bb75b81e /arch/x86/kernel/irq_32.c
parent9aa8d7195acb18fc436847f6c66a97f8359ad54d (diff)
x86: expand /proc/interrupts to include missing vectors, v2
Add missing IRQs and IRQ descriptions to /proc/interrupts. /proc/interrupts is most useful when it displays every IRQ vector in use by the system, not just those somebody thought would be interesting. This patch inserts the following vector displays to the i386 and x86_64 platforms, as appropriate: rescheduling interrupts TLB flush interrupts function call interrupts thermal event interrupts threshold interrupts spurious interrupts A threshold interrupt occurs when ECC memory correction is occuring at too high a frequency. Thresholds are used by the ECC hardware as occasional ECC failures are part of normal operation, but long sequences of ECC failures usually indicate a memory chip that is about to fail. Thermal event interrupts occur when a temperature threshold has been exceeded for some CPU chip. IIRC, a thermal interrupt is also generated when the temperature drops back to a normal level. A spurious interrupt is an interrupt that was raised then lowered by the device before it could be fully processed by the APIC. Hence the apic sees the interrupt but does not know what device it came from. For this case the APIC hardware will assume a vector of 0xff. Rescheduling, call, and TLB flush interrupts are sent from one CPU to another per the needs of the OS. Typically, their statistics would be used to discover if an interrupt flood of the given type has been occuring. AK: merged v2 and v4 which had some more tweaks AK: replace Local interrupts with Local timer interrupts AK: Fixed description of interrupt types. [ tglx: arch/x86 adaptation ] [ mingo: small cleanup ] Signed-off-by: Joe Korty <joe.korty@ccur.com> Signed-off-by: Andi Kleen <ak@suse.de> Cc: Tim Hockin <thockin@hockin.org> Cc: Andi Kleen <ak@suse.de> Cc: Ingo Molnar <mingo@elte.hu> Cc: "H. Peter Anvin" <hpa@zytor.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/irq_32.c')
-rw-r--r--arch/x86/kernel/irq_32.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c
index e173b763f148..10f359021aae 100644
--- a/arch/x86/kernel/irq_32.c
+++ b/arch/x86/kernel/irq_32.c
@@ -280,14 +280,41 @@ skip:
280 seq_printf(p, "NMI: "); 280 seq_printf(p, "NMI: ");
281 for_each_online_cpu(j) 281 for_each_online_cpu(j)
282 seq_printf(p, "%10u ", nmi_count(j)); 282 seq_printf(p, "%10u ", nmi_count(j));
283 seq_putc(p, '\n'); 283 seq_printf(p, " Non-maskable interrupts\n");
284#ifdef CONFIG_X86_LOCAL_APIC 284#ifdef CONFIG_X86_LOCAL_APIC
285 seq_printf(p, "LOC: "); 285 seq_printf(p, "LOC: ");
286 for_each_online_cpu(j) 286 for_each_online_cpu(j)
287 seq_printf(p, "%10u ", 287 seq_printf(p, "%10u ",
288 per_cpu(irq_stat,j).apic_timer_irqs); 288 per_cpu(irq_stat,j).apic_timer_irqs);
289 seq_putc(p, '\n'); 289 seq_printf(p, " Local timer interrupts\n");
290#endif 290#endif
291#ifdef CONFIG_SMP
292 seq_printf(p, "RES: ");
293 for_each_online_cpu(j)
294 seq_printf(p, "%10u ",
295 per_cpu(irq_stat,j).irq_resched_count);
296 seq_printf(p, " Rescheduling interrupts\n");
297 seq_printf(p, "CAL: ");
298 for_each_online_cpu(j)
299 seq_printf(p, "%10u ",
300 per_cpu(irq_stat,j).irq_call_count);
301 seq_printf(p, " function call interrupts\n");
302 seq_printf(p, "TLB: ");
303 for_each_online_cpu(j)
304 seq_printf(p, "%10u ",
305 per_cpu(irq_stat,j).irq_tlb_count);
306 seq_printf(p, " TLB shootdowns\n");
307#endif
308 seq_printf(p, "TRM: ");
309 for_each_online_cpu(j)
310 seq_printf(p, "%10u ",
311 per_cpu(irq_stat,j).irq_thermal_count);
312 seq_printf(p, " Thermal event interrupts\n");
313 seq_printf(p, "SPU: ");
314 for_each_online_cpu(j)
315 seq_printf(p, "%10u ",
316 per_cpu(irq_stat,j).irq_spurious_count);
317 seq_printf(p, " Spurious interrupts\n");
291 seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); 318 seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
292#if defined(CONFIG_X86_IO_APIC) 319#if defined(CONFIG_X86_IO_APIC)
293 seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count)); 320 seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));