diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-04-06 05:45:03 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-07 04:48:56 -0400 |
commit | b6276f353bf490add62dcf7db0ebd75baa3e1a37 (patch) | |
tree | 9720a848fca77555bef9658c56445815f6f2a29d /arch/x86/kernel/irq.c | |
parent | 671dec5daf3b3c43c5777be282f00120a44cf37f (diff) |
perf_counter: x86: self-IPI for pending work
Implement set_perf_counter_pending() with a self-IPI so that it will
run ASAP in a usable context.
For now use a second IRQ vector, because the primary vector pokes
the apic in funny ways that seem to confuse things.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
LKML-Reference: <20090406094517.724626696@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/irq.c')
-rw-r--r-- | arch/x86/kernel/irq.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 9c2754302ecc..d465487da587 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
@@ -67,6 +67,10 @@ static int show_other_interrupts(struct seq_file *p, int prec) | |||
67 | for_each_online_cpu(j) | 67 | for_each_online_cpu(j) |
68 | seq_printf(p, "%10u ", irq_stats(j)->apic_perf_irqs); | 68 | seq_printf(p, "%10u ", irq_stats(j)->apic_perf_irqs); |
69 | seq_printf(p, " Performance counter interrupts\n"); | 69 | seq_printf(p, " Performance counter interrupts\n"); |
70 | seq_printf(p, "PND: "); | ||
71 | for_each_online_cpu(j) | ||
72 | seq_printf(p, "%10u ", irq_stats(j)->apic_pending_irqs); | ||
73 | seq_printf(p, " Performance pending work\n"); | ||
70 | #endif | 74 | #endif |
71 | if (generic_interrupt_extension) { | 75 | if (generic_interrupt_extension) { |
72 | seq_printf(p, "PLT: "); | 76 | seq_printf(p, "PLT: "); |
@@ -171,6 +175,7 @@ u64 arch_irq_stat_cpu(unsigned int cpu) | |||
171 | sum += irq_stats(cpu)->apic_timer_irqs; | 175 | sum += irq_stats(cpu)->apic_timer_irqs; |
172 | sum += irq_stats(cpu)->irq_spurious_count; | 176 | sum += irq_stats(cpu)->irq_spurious_count; |
173 | sum += irq_stats(cpu)->apic_perf_irqs; | 177 | sum += irq_stats(cpu)->apic_perf_irqs; |
178 | sum += irq_stats(cpu)->apic_pending_irqs; | ||
174 | #endif | 179 | #endif |
175 | if (generic_interrupt_extension) | 180 | if (generic_interrupt_extension) |
176 | sum += irq_stats(cpu)->generic_irqs; | 181 | sum += irq_stats(cpu)->generic_irqs; |