History

perf,x86: fix wrmsr_on_cpu() warning on suspend/resume

Commit 1d9d8639c063 ("perf,x86: fix kernel crash with PEBS/BTS after suspend/resume") fixed a crash when doing PEBS performance profiling after resuming, but in using init_debug_store_on_cpu() to restore the DS_AREA mtrr it also resulted in a new WARN_ON() triggering. init_debug_store_on_cpu() uses "wrmsr_on_cpu()", which in turn uses CPU cross-calls to do the MSR update. Which is not really valid at the early resume stage, and the warning is quite reasonable. Now, it all happens to _work_, for the simple reason that smp_call_function_single() ends up just doing the call directly on the CPU when the CPU number matches, but we really should just do the wrmsr() directly instead. This duplicates the wrmsr() logic, but hopefully we can just remove the wrmsr_on_cpu() version eventually.

Linus Torvalds committed 13 years ago

Commit 2a6e06b1 parent 08637021 file · +3 −1Browse files

Unified · Split

arch/x86/kernel/cpu/perf_event_intel_ds.c+3−1
@@ -732,8 +732,10 @@ void intel_ds_init(void) · 731 unmodified lines
732 732
733void perf_restore_debug_store(void)733void perf_restore_debug_store(void)
734{734{
735 struct debug_store *ds = __this_cpu_read(cpu_hw_events.ds);
736
735 if (!x86_pmu.bts && !x86_pmu.pebs)737 if (!x86_pmu.bts && !x86_pmu.pebs)
736 return;738 return;
737 739
738 init_debug_store_on_cpu(smp_processor_id());740 wrmsrl(MSR_IA32_DS_AREA, (unsigned long)ds);
739}741}