diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/apic_32.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/apic_64.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/p4.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/irq_32.c | 31 | ||||
-rw-r--r-- | arch/x86/kernel/irq_64.c | 30 | ||||
-rw-r--r-- | arch/x86/kernel/mce_amd_64.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/mce_intel_64.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/smp_32.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/smp_64.c | 3 | ||||
-rw-r--r-- | arch/x86/mach-voyager/voyager_smp.c | 1 | ||||
-rw-r--r-- | arch/x86/xen/smp.c | 1 |
11 files changed, 70 insertions, 4 deletions
diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c index 3d67ae18d762..793341fffc81 100644 --- a/arch/x86/kernel/apic_32.c +++ b/arch/x86/kernel/apic_32.c | |||
@@ -1277,6 +1277,7 @@ void smp_spurious_interrupt(struct pt_regs *regs) | |||
1277 | /* see sw-dev-man vol 3, chapter 7.4.13.5 */ | 1277 | /* see sw-dev-man vol 3, chapter 7.4.13.5 */ |
1278 | printk(KERN_INFO "spurious APIC interrupt on CPU#%d, " | 1278 | printk(KERN_INFO "spurious APIC interrupt on CPU#%d, " |
1279 | "should never happen.\n", smp_processor_id()); | 1279 | "should never happen.\n", smp_processor_id()); |
1280 | __get_cpu_var(irq_stat).irq_spurious_count++; | ||
1280 | irq_exit(); | 1281 | irq_exit(); |
1281 | } | 1282 | } |
1282 | 1283 | ||
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c index 2250c654eacc..f47bc493dba9 100644 --- a/arch/x86/kernel/apic_64.c +++ b/arch/x86/kernel/apic_64.c | |||
@@ -1140,6 +1140,7 @@ asmlinkage void smp_spurious_interrupt(void) | |||
1140 | if (v & (1 << (SPURIOUS_APIC_VECTOR & 0x1f))) | 1140 | if (v & (1 << (SPURIOUS_APIC_VECTOR & 0x1f))) |
1141 | ack_APIC_irq(); | 1141 | ack_APIC_irq(); |
1142 | 1142 | ||
1143 | add_pda(irq_spurious_count, 1); | ||
1143 | irq_exit(); | 1144 | irq_exit(); |
1144 | } | 1145 | } |
1145 | 1146 | ||
diff --git a/arch/x86/kernel/cpu/mcheck/p4.c b/arch/x86/kernel/cpu/mcheck/p4.c index 1509edfb2313..be4dabfee1f5 100644 --- a/arch/x86/kernel/cpu/mcheck/p4.c +++ b/arch/x86/kernel/cpu/mcheck/p4.c | |||
@@ -61,6 +61,7 @@ fastcall void smp_thermal_interrupt(struct pt_regs *regs) | |||
61 | { | 61 | { |
62 | irq_enter(); | 62 | irq_enter(); |
63 | vendor_thermal_interrupt(regs); | 63 | vendor_thermal_interrupt(regs); |
64 | __get_cpu_var(irq_stat).irq_thermal_count++; | ||
64 | irq_exit(); | 65 | irq_exit(); |
65 | } | 66 | } |
66 | 67 | ||
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)); |
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c index 865669efc540..3881189df8ee 100644 --- a/arch/x86/kernel/irq_64.c +++ b/arch/x86/kernel/irq_64.c | |||
@@ -86,11 +86,37 @@ skip: | |||
86 | seq_printf(p, "NMI: "); | 86 | seq_printf(p, "NMI: "); |
87 | for_each_online_cpu(j) | 87 | for_each_online_cpu(j) |
88 | seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count); | 88 | seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count); |
89 | seq_putc(p, '\n'); | 89 | seq_printf(p, " Non-maskable interrupts\n"); |
90 | seq_printf(p, "LOC: "); | 90 | seq_printf(p, "LOC: "); |
91 | for_each_online_cpu(j) | 91 | for_each_online_cpu(j) |
92 | seq_printf(p, "%10u ", cpu_pda(j)->apic_timer_irqs); | 92 | seq_printf(p, "%10u ", cpu_pda(j)->apic_timer_irqs); |
93 | seq_putc(p, '\n'); | 93 | seq_printf(p, " Local timer interrupts\n"); |
94 | #ifdef CONFIG_SMP | ||
95 | seq_printf(p, "RES: "); | ||
96 | for_each_online_cpu(j) | ||
97 | seq_printf(p, "%10u ", cpu_pda(j)->irq_resched_count); | ||
98 | seq_printf(p, " Rescheduling interrupts\n"); | ||
99 | seq_printf(p, "CAL: "); | ||
100 | for_each_online_cpu(j) | ||
101 | seq_printf(p, "%10u ", cpu_pda(j)->irq_call_count); | ||
102 | seq_printf(p, " function call interrupts\n"); | ||
103 | seq_printf(p, "TLB: "); | ||
104 | for_each_online_cpu(j) | ||
105 | seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count); | ||
106 | seq_printf(p, " TLB shootdowns\n"); | ||
107 | #endif | ||
108 | seq_printf(p, "TRM: "); | ||
109 | for_each_online_cpu(j) | ||
110 | seq_printf(p, "%10u ", cpu_pda(j)->irq_thermal_count); | ||
111 | seq_printf(p, " Thermal event interrupts\n"); | ||
112 | seq_printf(p, "THR: "); | ||
113 | for_each_online_cpu(j) | ||
114 | seq_printf(p, "%10u ", cpu_pda(j)->irq_threshold_count); | ||
115 | seq_printf(p, " Threshold APIC interrupts\n"); | ||
116 | seq_printf(p, "SPU: "); | ||
117 | for_each_online_cpu(j) | ||
118 | seq_printf(p, "%10u ", cpu_pda(j)->irq_spurious_count); | ||
119 | seq_printf(p, " Spurious interrupts\n"); | ||
94 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); | 120 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); |
95 | } | 121 | } |
96 | return 0; | 122 | return 0; |
diff --git a/arch/x86/kernel/mce_amd_64.c b/arch/x86/kernel/mce_amd_64.c index 805b62b1e0df..0d2afd96aca4 100644 --- a/arch/x86/kernel/mce_amd_64.c +++ b/arch/x86/kernel/mce_amd_64.c | |||
@@ -237,6 +237,7 @@ asmlinkage void mce_threshold_interrupt(void) | |||
237 | } | 237 | } |
238 | } | 238 | } |
239 | out: | 239 | out: |
240 | add_pda(irq_threshold_count, 1); | ||
240 | irq_exit(); | 241 | irq_exit(); |
241 | } | 242 | } |
242 | 243 | ||
diff --git a/arch/x86/kernel/mce_intel_64.c b/arch/x86/kernel/mce_intel_64.c index 6551505d8a2c..c17eaf5dd6dd 100644 --- a/arch/x86/kernel/mce_intel_64.c +++ b/arch/x86/kernel/mce_intel_64.c | |||
@@ -26,6 +26,7 @@ asmlinkage void smp_thermal_interrupt(void) | |||
26 | if (therm_throt_process(msr_val & 1)) | 26 | if (therm_throt_process(msr_val & 1)) |
27 | mce_log_therm_throt_event(smp_processor_id(), msr_val); | 27 | mce_log_therm_throt_event(smp_processor_id(), msr_val); |
28 | 28 | ||
29 | add_pda(irq_thermal_count, 1); | ||
29 | irq_exit(); | 30 | irq_exit(); |
30 | } | 31 | } |
31 | 32 | ||
diff --git a/arch/x86/kernel/smp_32.c b/arch/x86/kernel/smp_32.c index eebc6e82576c..791d9f8036ae 100644 --- a/arch/x86/kernel/smp_32.c +++ b/arch/x86/kernel/smp_32.c | |||
@@ -342,6 +342,7 @@ fastcall void smp_invalidate_interrupt(struct pt_regs *regs) | |||
342 | smp_mb__after_clear_bit(); | 342 | smp_mb__after_clear_bit(); |
343 | out: | 343 | out: |
344 | put_cpu_no_resched(); | 344 | put_cpu_no_resched(); |
345 | __get_cpu_var(irq_stat).irq_tlb_count++; | ||
345 | } | 346 | } |
346 | 347 | ||
347 | void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | 348 | void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, |
@@ -640,6 +641,7 @@ static void native_smp_send_stop(void) | |||
640 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) | 641 | fastcall void smp_reschedule_interrupt(struct pt_regs *regs) |
641 | { | 642 | { |
642 | ack_APIC_irq(); | 643 | ack_APIC_irq(); |
644 | __get_cpu_var(irq_stat).irq_resched_count++; | ||
643 | } | 645 | } |
644 | 646 | ||
645 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) | 647 | fastcall void smp_call_function_interrupt(struct pt_regs *regs) |
@@ -660,6 +662,7 @@ fastcall void smp_call_function_interrupt(struct pt_regs *regs) | |||
660 | */ | 662 | */ |
661 | irq_enter(); | 663 | irq_enter(); |
662 | (*func)(info); | 664 | (*func)(info); |
665 | __get_cpu_var(irq_stat).irq_call_count++; | ||
663 | irq_exit(); | 666 | irq_exit(); |
664 | 667 | ||
665 | if (wait) { | 668 | if (wait) { |
diff --git a/arch/x86/kernel/smp_64.c b/arch/x86/kernel/smp_64.c index df4a82812adb..5c2964727d19 100644 --- a/arch/x86/kernel/smp_64.c +++ b/arch/x86/kernel/smp_64.c | |||
@@ -163,6 +163,7 @@ asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs) | |||
163 | out: | 163 | out: |
164 | ack_APIC_irq(); | 164 | ack_APIC_irq(); |
165 | cpu_clear(cpu, f->flush_cpumask); | 165 | cpu_clear(cpu, f->flush_cpumask); |
166 | add_pda(irq_tlb_count, 1); | ||
166 | } | 167 | } |
167 | 168 | ||
168 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | 169 | static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, |
@@ -493,6 +494,7 @@ void smp_send_stop(void) | |||
493 | asmlinkage void smp_reschedule_interrupt(void) | 494 | asmlinkage void smp_reschedule_interrupt(void) |
494 | { | 495 | { |
495 | ack_APIC_irq(); | 496 | ack_APIC_irq(); |
497 | add_pda(irq_resched_count, 1); | ||
496 | } | 498 | } |
497 | 499 | ||
498 | asmlinkage void smp_call_function_interrupt(void) | 500 | asmlinkage void smp_call_function_interrupt(void) |
@@ -514,6 +516,7 @@ asmlinkage void smp_call_function_interrupt(void) | |||
514 | exit_idle(); | 516 | exit_idle(); |
515 | irq_enter(); | 517 | irq_enter(); |
516 | (*func)(info); | 518 | (*func)(info); |
519 | add_pda(irq_call_count, 1); | ||
517 | irq_exit(); | 520 | irq_exit(); |
518 | if (wait) { | 521 | if (wait) { |
519 | mb(); | 522 | mb(); |
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 1f86b529dbbb..e4928aa6bdfb 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
@@ -1037,6 +1037,7 @@ smp_call_function_interrupt(void) | |||
1037 | */ | 1037 | */ |
1038 | irq_enter(); | 1038 | irq_enter(); |
1039 | (*func)(info); | 1039 | (*func)(info); |
1040 | __get_cpu_var(irq_stat).irq_call_count++; | ||
1040 | irq_exit(); | 1041 | irq_exit(); |
1041 | if (wait) { | 1042 | if (wait) { |
1042 | mb(); | 1043 | mb(); |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 4fa33c27ccb6..6c058585459c 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -356,6 +356,7 @@ static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) | |||
356 | */ | 356 | */ |
357 | irq_enter(); | 357 | irq_enter(); |
358 | (*func)(info); | 358 | (*func)(info); |
359 | __get_cpu_var(irq_stat).irq_call_count++; | ||
359 | irq_exit(); | 360 | irq_exit(); |
360 | 361 | ||
361 | if (wait) { | 362 | if (wait) { |