Re: perf hw in kexeced kernel broken in tip

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Peter Zijlstra
Date: Wednesday, December 8, 2010 - 7:59 am

On Wed, 2010-12-08 at 15:20 +0100, Peter Zijlstra wrote:


Something like so..

---
Subject: perf, x86: Detect broken BIOSes
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
Date: Wed Dec 08 15:56:23 CET 2010

Some BIOSes use PMU resources, this is a bug.

Try to detect this, warn about it, and further refuse to touch the
PMU ourselves.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
Index: linux-2.6/arch/x86/kernel/cpu/perf_event.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/cpu/perf_event.c
+++ linux-2.6/arch/x86/kernel/cpu/perf_event.c
@@ -375,15 +375,51 @@ static void release_pmc_hardware(void) {
 static bool check_hw_exists(void)
 {
 	u64 val, val_new = 0;
-	int ret = 0;
+	int i, reg, ret = 0;
 
+	/*
+	 * Check to see if the BIOS enabled any of the counters, if so
+	 * complain and bail.
+	 */
+	for (i = 0; i < x86_pmu.num_counters; i++) {
+		reg = x86_pmu.eventsel + i;
+		ret = rdmsrl_safe(reg, &val);
+		if (ret)
+			goto msr_fail;
+		if (val & ARCH_PERFMON_EVENTSEL_ENABLE)
+			goto bios_fail;
+	}
+
+	for (i = 0; i < x86_pmu.num_counters_fixed; i++) {
+		reg = MSR_ARCH_PERFMON_FIXED_CTR_CTRL;
+		ret = rdmsrl_safe(reg, &val);
+		if (ret)
+			goto msr_fail;
+		if (val & (0x03 << i*4))
+			goto bios_fail;
+	}
+
+	/*
+	 * Now write a value and read it back to see if it matches,
+	 * this is needed to detect certain hardware emulators (qemu/kvm)
+	 * that don't trap on the MSR access and always return 0s.
+	 */
 	val = 0xabcdUL;
-	ret |= checking_wrmsrl(x86_pmu.perfctr, val);
+	ret = checking_wrmsrl(x86_pmu.perfctr, val);
 	ret |= rdmsrl_safe(x86_pmu.perfctr, &val_new);
 	if (ret || val != val_new)
-		return false;
+		goto msr_fail;
 
 	return true;
+
+bios_fail:
+	printk(KERN_CONT "Broken BIOS detected, software events only.\n");
+	printk(KERN_ERR FW_BUG "invalid MSR: %x=%Lx\n", reg, val);
+	return false;
+
+msr_fail:
+	printk(KERN_CONT "Broken PMU hardware detected, software events only.\n");
+	return false;
 }
 
 static void reserve_ds_buffers(void);
@@ -1378,10 +1414,8 @@ int __init init_hw_perf_events(void)
 	pmu_check_apic();
 
 	/* sanity check that the hardware exists or is emulated */
-	if (!check_hw_exists()) {
-		pr_cont("Broken PMU hardware detected, software events only.\n");
+	if (!check_hw_exists())
 		return 0;
-	}
 
 	pr_cont("%s PMU driver.\n", x86_pmu.name);
 

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
perf hw in kexeced kernel broken in tip, Yinghai Lu, (Wed Dec 1, 1:00 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 1, 4:27 am)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 1, 9:06 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 1, 9:11 am)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 1, 9:23 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 1, 12:38 pm)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 1, 12:46 pm)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 1, 12:49 pm)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 1, 12:58 pm)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 1, 1:07 pm)
Re: perf hw in kexeced kernel broken in tip, Eric W. Biederman, (Wed Dec 1, 1:41 pm)
Re: perf hw in kexeced kernel broken in tip, Eric W. Biederman, (Wed Dec 1, 2:48 pm)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Wed Dec 1, 10:23 pm)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Thu Dec 2, 12:34 am)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Thu Dec 2, 9:15 am)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Tue Dec 7, 2:16 pm)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Tue Dec 7, 4:30 pm)
Re: perf hw in kexeced kernel broken in tip, Yinghai Lu, (Tue Dec 7, 5:26 pm)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 3:39 am)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Wed Dec 8, 7:01 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 7:20 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 7:33 am)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 8, 7:39 am)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 8, 7:42 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 7:48 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 7:59 am)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 8, 8:02 am)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 8:15 am)
Re: perf hw in kexeced kernel broken in tip, Vivek Goyal, (Wed Dec 8, 8:22 am)
Re: perf hw in kexeced kernel broken in tip, Yinghai Lu, (Wed Dec 8, 11:43 am)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Wed Dec 8, 12:01 pm)
Re: perf hw in kexeced kernel broken in tip, Yinghai Lu, (Wed Dec 8, 12:05 pm)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 12:06 pm)
Re: perf hw in kexeced kernel broken in tip, Peter Zijlstra, (Wed Dec 8, 12:17 pm)
Re: perf hw in kexeced kernel broken in tip, Yinghai Lu, (Wed Dec 8, 12:20 pm)
Re: perf hw in kexeced kernel broken in tip, Yinghai Lu, (Wed Dec 8, 12:20 pm)
Re: perf hw in kexeced kernel broken in tip, Eric W. Biederman, (Wed Dec 8, 2:16 pm)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Wed Dec 8, 3:37 pm)
Re: perf hw in kexeced kernel broken in tip, Eric W. Biederman, (Wed Dec 8, 4:20 pm)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Wed Dec 8, 9:34 pm)
Re: perf hw in kexeced kernel broken in tip, Don Zickus, (Thu Dec 9, 1:20 pm)
Re: perf hw in kexeced kernel broken in tip, Cyrill Gorcunov, (Thu Dec 9, 1:44 pm)