提交 a3288106 编写于 作者: Y Yong Wang 提交者: Ingo Molnar

perf_counter/x86: Remove the IRQ (non-NMI) handling bits

Remove the IRQ (non-NMI) handling bits as NMI will be used always.
Signed-off-by: NYong Wang <yong.y.wang@intel.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: John Kacur <jkacur@redhat.com>
LKML-Reference: <20090603051255.GA2791@ywang-moblin2.bj.intel.com>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 addc2785
...@@ -49,7 +49,6 @@ BUILD_INTERRUPT(error_interrupt,ERROR_APIC_VECTOR) ...@@ -49,7 +49,6 @@ BUILD_INTERRUPT(error_interrupt,ERROR_APIC_VECTOR)
BUILD_INTERRUPT(spurious_interrupt,SPURIOUS_APIC_VECTOR) BUILD_INTERRUPT(spurious_interrupt,SPURIOUS_APIC_VECTOR)
#ifdef CONFIG_PERF_COUNTERS #ifdef CONFIG_PERF_COUNTERS
BUILD_INTERRUPT(perf_counter_interrupt, LOCAL_PERF_VECTOR)
BUILD_INTERRUPT(perf_pending_interrupt, LOCAL_PENDING_VECTOR) BUILD_INTERRUPT(perf_pending_interrupt, LOCAL_PENDING_VECTOR)
#endif #endif
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
extern void apic_timer_interrupt(void); extern void apic_timer_interrupt(void);
extern void generic_interrupt(void); extern void generic_interrupt(void);
extern void error_interrupt(void); extern void error_interrupt(void);
extern void perf_counter_interrupt(void);
extern void perf_pending_interrupt(void); extern void perf_pending_interrupt(void);
extern void spurious_interrupt(void); extern void spurious_interrupt(void);
......
...@@ -106,11 +106,6 @@ ...@@ -106,11 +106,6 @@
*/ */
#define LOCAL_TIMER_VECTOR 0xef #define LOCAL_TIMER_VECTOR 0xef
/*
* Performance monitoring interrupt vector:
*/
#define LOCAL_PERF_VECTOR 0xee
/* /*
* Generic system vector for platform specific use * Generic system vector for platform specific use
*/ */
......
...@@ -40,7 +40,7 @@ struct cpu_hw_counters { ...@@ -40,7 +40,7 @@ struct cpu_hw_counters {
struct x86_pmu { struct x86_pmu {
const char *name; const char *name;
int version; int version;
int (*handle_irq)(struct pt_regs *, int); int (*handle_irq)(struct pt_regs *);
void (*disable_all)(void); void (*disable_all)(void);
void (*enable_all)(void); void (*enable_all)(void);
void (*enable)(struct hw_perf_counter *, int); void (*enable)(struct hw_perf_counter *, int);
...@@ -755,7 +755,7 @@ static void intel_pmu_reset(void) ...@@ -755,7 +755,7 @@ static void intel_pmu_reset(void)
* This handler is triggered by the local APIC, so the APIC IRQ handling * This handler is triggered by the local APIC, so the APIC IRQ handling
* rules apply: * rules apply:
*/ */
static int intel_pmu_handle_irq(struct pt_regs *regs, int nmi) static int intel_pmu_handle_irq(struct pt_regs *regs)
{ {
struct cpu_hw_counters *cpuc; struct cpu_hw_counters *cpuc;
struct cpu_hw_counters; struct cpu_hw_counters;
...@@ -794,7 +794,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs, int nmi) ...@@ -794,7 +794,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs, int nmi)
if (!intel_pmu_save_and_restart(counter)) if (!intel_pmu_save_and_restart(counter))
continue; continue;
if (perf_counter_overflow(counter, nmi, regs, 0)) if (perf_counter_overflow(counter, 1, regs, 0))
intel_pmu_disable_counter(&counter->hw, bit); intel_pmu_disable_counter(&counter->hw, bit);
} }
...@@ -812,7 +812,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs, int nmi) ...@@ -812,7 +812,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs, int nmi)
return 1; return 1;
} }
static int amd_pmu_handle_irq(struct pt_regs *regs, int nmi) static int amd_pmu_handle_irq(struct pt_regs *regs)
{ {
int cpu, idx, handled = 0; int cpu, idx, handled = 0;
struct cpu_hw_counters *cpuc; struct cpu_hw_counters *cpuc;
...@@ -840,22 +840,13 @@ static int amd_pmu_handle_irq(struct pt_regs *regs, int nmi) ...@@ -840,22 +840,13 @@ static int amd_pmu_handle_irq(struct pt_regs *regs, int nmi)
if (!x86_perf_counter_set_period(counter, hwc, idx)) if (!x86_perf_counter_set_period(counter, hwc, idx))
continue; continue;
if (perf_counter_overflow(counter, nmi, regs, 0)) if (perf_counter_overflow(counter, 1, regs, 0))
amd_pmu_disable_counter(hwc, idx); amd_pmu_disable_counter(hwc, idx);
} }
return handled; return handled;
} }
void smp_perf_counter_interrupt(struct pt_regs *regs)
{
irq_enter();
apic_write(APIC_LVTPC, LOCAL_PERF_VECTOR);
ack_APIC_irq();
x86_pmu.handle_irq(regs, 0);
irq_exit();
}
void smp_perf_pending_interrupt(struct pt_regs *regs) void smp_perf_pending_interrupt(struct pt_regs *regs)
{ {
irq_enter(); irq_enter();
...@@ -910,7 +901,7 @@ perf_counter_nmi_handler(struct notifier_block *self, ...@@ -910,7 +901,7 @@ perf_counter_nmi_handler(struct notifier_block *self,
* If the first NMI handles both, the latter will be empty and daze * If the first NMI handles both, the latter will be empty and daze
* the CPU. * the CPU.
*/ */
x86_pmu.handle_irq(regs, 1); x86_pmu.handle_irq(regs);
return NOTIFY_STOP; return NOTIFY_STOP;
} }
......
...@@ -1026,8 +1026,6 @@ apicinterrupt SPURIOUS_APIC_VECTOR \ ...@@ -1026,8 +1026,6 @@ apicinterrupt SPURIOUS_APIC_VECTOR \
spurious_interrupt smp_spurious_interrupt spurious_interrupt smp_spurious_interrupt
#ifdef CONFIG_PERF_COUNTERS #ifdef CONFIG_PERF_COUNTERS
apicinterrupt LOCAL_PERF_VECTOR \
perf_counter_interrupt smp_perf_counter_interrupt
apicinterrupt LOCAL_PENDING_VECTOR \ apicinterrupt LOCAL_PENDING_VECTOR \
perf_pending_interrupt smp_perf_pending_interrupt perf_pending_interrupt smp_perf_pending_interrupt
#endif #endif
......
...@@ -165,7 +165,6 @@ static void __init apic_intr_init(void) ...@@ -165,7 +165,6 @@ static void __init apic_intr_init(void)
alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt);
alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt);
# ifdef CONFIG_PERF_COUNTERS # ifdef CONFIG_PERF_COUNTERS
alloc_intr_gate(LOCAL_PERF_VECTOR, perf_counter_interrupt);
alloc_intr_gate(LOCAL_PENDING_VECTOR, perf_pending_interrupt); alloc_intr_gate(LOCAL_PENDING_VECTOR, perf_pending_interrupt);
# endif # endif
......
...@@ -155,7 +155,6 @@ static void __init apic_intr_init(void) ...@@ -155,7 +155,6 @@ static void __init apic_intr_init(void)
/* Performance monitoring interrupt: */ /* Performance monitoring interrupt: */
#ifdef CONFIG_PERF_COUNTERS #ifdef CONFIG_PERF_COUNTERS
alloc_intr_gate(LOCAL_PERF_VECTOR, perf_counter_interrupt);
alloc_intr_gate(LOCAL_PENDING_VECTOR, perf_pending_interrupt); alloc_intr_gate(LOCAL_PENDING_VECTOR, perf_pending_interrupt);
#endif #endif
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册