提交 3fb2b8dd 编写于 作者: P Peter Zijlstra 提交者: Ingo Molnar

perf, x86, Do not user perf_disable from NMI context

Explicitly use intel_pmu_{disable,enable}_all() in intel_pmu_handle_irq()
to avoid the NMI race conditions in perf_{disable,enable}
Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
Cc: paulus@samba.org
Cc: eranian@google.com
Cc: robert.richter@amd.com
Cc: fweisbec@gmail.com
LKML-Reference: <new-submission>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 32975a4f
...@@ -745,11 +745,11 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) ...@@ -745,11 +745,11 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
cpuc = &__get_cpu_var(cpu_hw_events); cpuc = &__get_cpu_var(cpu_hw_events);
perf_disable(); intel_pmu_disable_all();
intel_pmu_drain_bts_buffer(); intel_pmu_drain_bts_buffer();
status = intel_pmu_get_status(); status = intel_pmu_get_status();
if (!status) { if (!status) {
perf_enable(); intel_pmu_enable_all();
return 0; return 0;
} }
...@@ -759,8 +759,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) ...@@ -759,8 +759,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
WARN_ONCE(1, "perfevents: irq loop stuck!\n"); WARN_ONCE(1, "perfevents: irq loop stuck!\n");
perf_event_print_debug(); perf_event_print_debug();
intel_pmu_reset(); intel_pmu_reset();
perf_enable(); goto done;
return 1;
} }
inc_irq_stat(apic_perf_irqs); inc_irq_stat(apic_perf_irqs);
...@@ -790,8 +789,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) ...@@ -790,8 +789,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
if (status) if (status)
goto again; goto again;
perf_enable(); done:
intel_pmu_enable_all();
return 1; return 1;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册