cpufreq / intel_pstate: Add function to check that all MSRs 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. References: https://bugzilla.redhat.com/show_bug.cgi?id=922923 Reported-by: Josh Stone <jistone@redhat.com> Signed-off-by: Dirk Brandewie <dirk.j.brandewie@intel.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
8bb9660418
commit
b563b4e3f2
|
@ -752,6 +752,29 @@ static struct cpufreq_driver intel_pstate_driver = {
|
|||
|
||||
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 +787,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());
|
||||
|
|
Loading…
Reference in New Issue