Messages in this thread | | | Date | Wed, 12 Sep 2012 19:36:24 +0200 | From | Oleg Nesterov <> | Subject | Re: [RFC][PATCH] perf, intel: Don't touch MSR_IA32_DEBUGCTLMSR from NMI context |
| |
On 09/12, Peter Zijlstra wrote: > > Oleg and Sebastian found that touching MSR_IA32_DEBUGCTLMSR from NMI > context is problematic since the only way to change the various > unrelated bits in there is: > > debugctl = get_debugctlmsr() > /* frob flags in debugctl */ > update_debugctlmsr(debugctl); > > Which is entirely unsafe if we prod at the MSR from NMI context. > > In particular the path that is responsible is: > > x86_pmu_handle_irq() (NMI handler) > x86_pmu_stop() > x86_pmu.disable -> intel_pmu_disable_event() > intel_pmu_lbr_disable() > __intel_pmu_lbr_disable() > wrmsrl(MSR_IA32_DEBUGCTLMSR,... );
Not only.
x86_pmu_handle_irq() does intel_pmu_disable_all() and intel_pmu_enable_all(), this leads to intel_pmu_enable_bts() and intel_pmu_disable_bts().
And those intel_pmu_*_bts() are also called by intel_pmu_disable_event() and intel_pmu_enable_event(), the latter is probably fine.
Oleg.
| |