Commit b6276f35 authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

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: default avatarPeter 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: default avatarIngo Molnar <mingo@elte.hu>
parent 671dec5d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ BUILD_INTERRUPT(spurious_interrupt,SPURIOUS_APIC_VECTOR)

#ifdef CONFIG_PERF_COUNTERS
BUILD_INTERRUPT(perf_counter_interrupt, LOCAL_PERF_VECTOR)
BUILD_INTERRUPT(perf_pending_interrupt, LOCAL_PENDING_VECTOR)
#endif

#ifdef CONFIG_X86_MCE_P4THERMAL
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ typedef struct {
#endif
	unsigned int generic_irqs;	/* arch dependent */
	unsigned int apic_perf_irqs;
	unsigned int apic_pending_irqs;
#ifdef CONFIG_SMP
	unsigned int irq_resched_count;
	unsigned int irq_call_count;
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ extern void apic_timer_interrupt(void);
extern void generic_interrupt(void);
extern void error_interrupt(void);
extern void perf_counter_interrupt(void);
extern void perf_pending_interrupt(void);

extern void spurious_interrupt(void);
extern void thermal_interrupt(void);
+5 −0
Original line number Diff line number Diff line
@@ -116,6 +116,11 @@
 */
#define GENERIC_INTERRUPT_VECTOR	0xed

/*
 * Performance monitoring pending work vector:
 */
#define LOCAL_PENDING_VECTOR		0xec

/*
 * First APIC vector available to drivers: (vectors 0x30-0xee) we
 * start at 0x31(0x41) to spread out vectors evenly between priority
+2 −1
Original line number Diff line number Diff line
@@ -84,7 +84,8 @@ union cpuid10_edx {
#define MSR_ARCH_PERFMON_FIXED_CTR2			0x30b
#define X86_PMC_IDX_FIXED_BUS_CYCLES			(X86_PMC_IDX_FIXED + 2)

#define set_perf_counter_pending()	do { } while (0)
extern void set_perf_counter_pending(void);

#define clear_perf_counter_pending()	do { } while (0)
#define test_perf_counter_pending()	(0)

Loading