|
@@ -446,7 +446,7 @@ static void core_set_pstate(struct cpudata *cpudata, int pstate)
|
|
|
if (limits.no_turbo)
|
|
|
val |= (u64)1 << 32;
|
|
|
|
|
|
- wrmsrl(MSR_IA32_PERF_CTL, val);
|
|
|
+ wrmsrl_on_cpu(cpudata->cpu, MSR_IA32_PERF_CTL, val);
|
|
|
}
|
|
|
|
|
|
static struct cpu_defaults core_params = {
|
|
@@ -771,14 +771,17 @@ static int intel_pstate_verify_policy(struct cpufreq_policy *policy)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int intel_pstate_cpu_exit(struct cpufreq_policy *policy)
|
|
|
+static void intel_pstate_stop_cpu(struct cpufreq_policy *policy)
|
|
|
{
|
|
|
- int cpu = policy->cpu;
|
|
|
+ int cpu_num = policy->cpu;
|
|
|
+ struct cpudata *cpu = all_cpu_data[cpu_num];
|
|
|
|
|
|
- del_timer(&all_cpu_data[cpu]->timer);
|
|
|
- kfree(all_cpu_data[cpu]);
|
|
|
- all_cpu_data[cpu] = NULL;
|
|
|
- return 0;
|
|
|
+ pr_info("intel_pstate CPU %d exiting\n", cpu_num);
|
|
|
+
|
|
|
+ del_timer(&all_cpu_data[cpu_num]->timer);
|
|
|
+ intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate);
|
|
|
+ kfree(all_cpu_data[cpu_num]);
|
|
|
+ all_cpu_data[cpu_num] = NULL;
|
|
|
}
|
|
|
|
|
|
static int intel_pstate_cpu_init(struct cpufreq_policy *policy)
|
|
@@ -816,7 +819,7 @@ static struct cpufreq_driver intel_pstate_driver = {
|
|
|
.setpolicy = intel_pstate_set_policy,
|
|
|
.get = intel_pstate_get,
|
|
|
.init = intel_pstate_cpu_init,
|
|
|
- .exit = intel_pstate_cpu_exit,
|
|
|
+ .stop_cpu = intel_pstate_stop_cpu,
|
|
|
.name = "intel_pstate",
|
|
|
};
|
|
|
|