Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c323d95f authored by Yong Wang's avatar Yong Wang Committed by Ingo Molnar
Browse files

perf_counter/x86: Always use NMI for performance-monitoring interrupt



Always use NMI for performance-monitoring interrupt as there could be
racy situations if we switch between irq and nmi mode frequently.

Signed-off-by: default avatarYong Wang <yong.y.wang@intel.com>
LKML-Reference: <20090529052835.GA13657@ywang-moblin2.bj.intel.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent da417a75
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -91,10 +91,10 @@ extern void set_perf_counter_pending(void);

#ifdef CONFIG_PERF_COUNTERS
extern void init_hw_perf_counters(void);
extern void perf_counters_lapic_init(int nmi);
extern void perf_counters_lapic_init(void);
#else
static inline void init_hw_perf_counters(void)		{ }
static inline void perf_counters_lapic_init(int nmi)	{ }
static inline void perf_counters_lapic_init(void)	{ }
#endif

#endif /* _ASM_X86_PERF_COUNTER_H */
+1 −1
Original line number Diff line number Diff line
@@ -1135,7 +1135,7 @@ void __cpuinit setup_local_APIC(void)
		apic_write(APIC_ESR, 0);
	}
#endif
	perf_counters_lapic_init(0);
	perf_counters_lapic_init();

	preempt_disable();

+5 −14
Original line number Diff line number Diff line
@@ -604,7 +604,7 @@ static int x86_pmu_enable(struct perf_counter *counter)
		hwc->counter_base = x86_pmu.perfctr;
	}

	perf_counters_lapic_init(hwc->nmi);
	perf_counters_lapic_init();

	x86_pmu.disable(hwc, idx);

@@ -863,24 +863,15 @@ void set_perf_counter_pending(void)
	apic->send_IPI_self(LOCAL_PENDING_VECTOR);
}

void perf_counters_lapic_init(int nmi)
void perf_counters_lapic_init(void)
{
	u32 apic_val;

	if (!x86_pmu_initialized())
		return;

	/*
	 * Enable the performance counter vector in the APIC LVT:
	 * Always use NMI for PMU
	 */
	apic_val = apic_read(APIC_LVTERR);

	apic_write(APIC_LVTERR, apic_val | APIC_LVT_MASKED);
	if (nmi)
	apic_write(APIC_LVTPC, APIC_DM_NMI);
	else
		apic_write(APIC_LVTPC, LOCAL_PERF_VECTOR);
	apic_write(APIC_LVTERR, apic_val);
}

static int __kprobes
@@ -1054,7 +1045,7 @@ void __init init_hw_perf_counters(void)

	pr_info("... counter mask:    %016Lx\n", perf_counter_mask);

	perf_counters_lapic_init(0);
	perf_counters_lapic_init();
	register_die_notifier(&perf_counter_nmi_notifier);
}