summaryrefslogtreecommitdiffstats
path: root/cpufreq-intel-pstate-validate-msrs.patch
diff options
context:
space:
mode:
authorDave Jones <davej@redhat.com>2013-03-19 15:05:22 -0400
committerDave Jones <davej@redhat.com>2013-03-19 15:05:22 -0400
commit6f9fa1acc9d60aa1aadb0dc4a8d07fd4227f5a46 (patch)
treedd6f1e6c977c66f3ca86c6fe6ce2474b7716a313 /cpufreq-intel-pstate-validate-msrs.patch
parent31befe51b60ac230a3beecb0909a17913559b76d (diff)
downloadkernel-6f9fa1acc9d60aa1aadb0dc4a8d07fd4227f5a46.tar.gz
kernel-6f9fa1acc9d60aa1aadb0dc4a8d07fd4227f5a46.tar.xz
kernel-6f9fa1acc9d60aa1aadb0dc4a8d07fd4227f5a46.zip
cpufreq/intel_pstate: Add function to check that all MSR's are valid (rhbz 922923)
Diffstat (limited to 'cpufreq-intel-pstate-validate-msrs.patch')
-rw-r--r--cpufreq-intel-pstate-validate-msrs.patch56
1 files changed, 56 insertions, 0 deletions
diff --git a/cpufreq-intel-pstate-validate-msrs.patch b/cpufreq-intel-pstate-validate-msrs.patch
new file mode 100644
index 000000000..0a790a0b6
--- /dev/null
+++ b/cpufreq-intel-pstate-validate-msrs.patch
@@ -0,0 +1,56 @@
+commit 866111646f2c5d4c6c25e2bb97f5c61c3992defb
+Author: Dirk Brandewie <dirk.brandewie@gmail.com>
+Date: Mon Mar 18 16:55:02 2013 -0700
+
+ cpufreq/intel_pstate: Add function to check that all MSR's are valid
+
+ Some VMs seem to try to implement some MSRs but not all the registers
+ the driver needs. Check to make sure all the MSR that we need are
+ available. If any of the required MSRs are not available refuse to
+ load.
+
+ Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com>
+
+--- linux-3.9.0-0.rc3.git0.2.fc19.x86_64/drivers/cpufreq/intel_pstate.c~ 2013-03-19 14:54:33.489581718 -0400
++++ linux-3.9.0-0.rc3.git0.2.fc19.x86_64/drivers/cpufreq/intel_pstate.c 2013-03-19 14:55:09.667523730 -0400
+@@ -752,6 +752,30 @@ static struct cpufreq_driver intel_pstat
+
+ static int __initdata no_load;
+
++static int intel_pstate_msrs_not_valid(void)
++{
++ /* Check that all the msr's we are using are valid. */
++ u64 aperf, mperf, tmp;
++
++ rdmsrl(MSR_IA32_APERF, aperf);
++ rdmsrl(MSR_IA32_MPERF, mperf);
++
++ if (!intel_pstate_min_pstate() ||
++ !intel_pstate_max_pstate() ||
++ !intel_pstate_turbo_pstate())
++ return -ENODEV;
++
++ rdmsrl(MSR_IA32_APERF, tmp);
++ if (!(tmp - aperf))
++ return -ENODEV;
++
++ rdmsrl(MSR_IA32_MPERF, tmp);
++ if (!(tmp - mperf))
++ return -ENODEV;
++
++ return 0;
++}
++
+ static int __init intel_pstate_init(void)
+ {
+ int cpu, rc = 0;
+@@ -764,6 +788,9 @@ static int __init intel_pstate_init(void
+ if (!id)
+ return -ENODEV;
+
++ if (intel_pstate_msrs_not_valid())
++ return -ENODEV;
++
+ pr_info("Intel P-state driver initializing.\n");
+
+ all_cpu_data = vmalloc(sizeof(void *) * num_possible_cpus());