57 lines
1.6 KiB
Diff
57 lines
1.6 KiB
Diff
|
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());
|