On 14 August 2014 16:49, Shilpasri G Bhat <shilpa.b...@linux.vnet.ibm.com> wrote: > This patch ensures the cpus to kexec/reboot at nominal frequency. > Nominal frequency is the highest cpu frequency on PowerPC at > which the cores can run without getting throttled. > > If the host kernel had set the cpus to a low pstate and then it > kexecs/reboots to a cpufreq disabled kernel it would cause the target > kernel to perform poorly. It will also increase the boot up time of > the target kernel. So set the cpus to high pstate, in this case to > nominal frequency before rebooting to avoid such scenarios. > > The reboot notifier will suspend the cpufreq governor and enable > nominal frequency to be set during a reboot/kexec similar to the > suspend operartion. > > Signed-off-by: Shilpasri G Bhat <shilpa.b...@linux.vnet.ibm.com> > Reviewed-by: Preeti U Murthy <pre...@linux.vnet.ibm.com> > --- > drivers/cpufreq/powernv-cpufreq.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/cpufreq/powernv-cpufreq.c > b/drivers/cpufreq/powernv-cpufreq.c > index 379c083..e9f3d3a 100644 > --- a/drivers/cpufreq/powernv-cpufreq.c > +++ b/drivers/cpufreq/powernv-cpufreq.c > @@ -26,6 +26,7 @@ > #include <linux/cpufreq.h> > #include <linux/smp.h> > #include <linux/of.h> > +#include <linux/reboot.h> > > #include <asm/cputhreads.h> > #include <asm/firmware.h> > @@ -314,9 +315,21 @@ static int powernv_cpufreq_cpu_init(struct > cpufreq_policy *policy) > for (i = 0; i < threads_per_core; i++) > cpumask_set_cpu(base + i, policy->cpus); > > + policy->suspend_freq = pstate_id_to_freq(powernv_pstate_info.nominal); > return cpufreq_table_validate_and_show(policy, powernv_freqs); > } > > +static int powernv_cpufreq_reboot_notifier(struct notifier_block *nb, > + unsigned long action, void *unused) > +{ > + cpufreq_suspend(); > + return NOTIFY_DONE; > +} > + > +static struct notifier_block powernv_cpufreq_reboot_nb = { > + .notifier_call = powernv_cpufreq_reboot_notifier, > +}; > + > static struct cpufreq_driver powernv_cpufreq_driver = { > .name = "powernv-cpufreq", > .flags = CPUFREQ_CONST_LOOPS, > @@ -325,6 +338,7 @@ static struct cpufreq_driver powernv_cpufreq_driver = { > .target_index = powernv_cpufreq_target_index, > .get = powernv_cpufreq_get, > .attr = powernv_cpu_freq_attr, > + .suspend = cpufreq_generic_suspend,
I couldn't understand why you have added a notifier here. This callback by itself should be enough. Isn't it? And then you have called cpufreq_suspend(), which is absolutely wrong, from that notifier.. -- 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/