On Sat, Mar 15, 2014 at 2:33 AM, <dirk.brande...@gmail.com> wrote: > From: Dirk Brandewie <dirk.j.brande...@intel.com> > > Change to use ->stop() callback to do clean up during CPU > hotplug. The requested P state for an offline core will be used by the > hardware coordination function to select the package P state. If the > core is under load when it is offlined it will fix the package P state > floor to the requested P state of offline core. > > Reported-by: Patrick Marlier <patrick.marl...@gmail.com> > Signed-off-by: Dirk Brandewie <dirk.j.brande...@intel.com> > --- > drivers/cpufreq/intel_pstate.c | 20 +++++++++++++------- > 1 file changed, 13 insertions(+), 7 deletions(-) > > diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c > index 2cd36b9..e9092fd 100644 > --- a/drivers/cpufreq/intel_pstate.c > +++ b/drivers/cpufreq/intel_pstate.c > @@ -447,7 +447,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 = { > @@ -773,16 +773,22 @@ static int intel_pstate_verify_policy(struct > cpufreq_policy *policy) > return 0; > } > > -static int intel_pstate_cpu_exit(struct cpufreq_policy *policy) > +static int intel_pstate_cpu_stop(struct cpufreq_policy *policy) > { > - int cpu = policy->cpu; > + int cpu_num = policy->cpu; > + struct cpudata *cpu = all_cpu_data[cpu_num]; > + > + 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; > > - del_timer(&all_cpu_data[cpu]->timer); > - kfree(all_cpu_data[cpu]); > - all_cpu_data[cpu] = NULL; > return 0; > } > > + > static int intel_pstate_cpu_init(struct cpufreq_policy *policy) > { > struct cpudata *cpu; > @@ -818,7 +824,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 = intel_pstate_cpu_stop,
Probably, keep exit as is and only change P-state in stop(). So that allocation of resources happen in init() and they are freed in exit()? -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/