[ 3.5.y.z extended stable ] Patch "perf, x86: fix wrmsr_on_cpu() warning on suspend/resume" has been added to staging queue

Luis Henriques luis.henriques at canonical.com
Wed Mar 20 10:43:58 UTC 2013

This is a note to let you know that I have just added a patch titled

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

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:


If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



>From fd186a7080f952819b89e86795ee93ea9788aea8 Mon Sep 17 00:00:00 2001
From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Sun, 17 Mar 2013 15:44:43 -0700
Subject: [PATCH] perf,x86: fix wrmsr_on_cpu() warning on suspend/resume

commit 2a6e06b2aed6995af401dcd4feb5e79a0c7ea554 upstream.

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.

Reported-and-tested-by: Parag Warudkar <parag.lkml at gmail.com>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
Luis Henriques <luis.henriques at canonical.com>
 arch/x86/kernel/cpu/perf_event_intel_ds.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c
index 9a9be1e..57a2d80 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_ds.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c
@@ -717,8 +717,10 @@ void intel_ds_init(void)

 void perf_restore_debug_store(void)
+	struct debug_store *ds = __this_cpu_read(cpu_hw_events.ds);
 	if (!x86_pmu.bts && !x86_pmu.pebs)

-	init_debug_store_on_cpu(smp_processor_id());
+	wrmsrl(MSR_IA32_DS_AREA, (unsigned long)ds);

More information about the kernel-team mailing list