From: Shilpasri G Bhat <hidden> Date: 2014-08-28 14:07:26
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 set the cpus to nominal frequncy.
Changes v1->v2:
Invoke .target() driver callback to set the cpus to nominal frequency
in reboot notifier, instead of calling cpufreq_suspend() as suggested
by Viresh Kumar.
Modified the commit message.
Signed-off-by: Shilpasri G Bhat <redacted>
Reviewed-by: Preeti U Murthy <redacted>
---
drivers/cpufreq/powernv-cpufreq.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
On 28 August 2014 19:36, Shilpasri G Bhat
[off-list ref] 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 set the cpus to nominal frequncy.
Changes v1->v2:
Invoke .target() driver callback to set the cpus to nominal frequency
in reboot notifier, instead of calling cpufreq_suspend() as suggested
by Viresh Kumar.
Modified the commit message.
This changelog will get commited, is this what you want?
quoted hunk
Signed-off-by: Shilpasri G Bhat <redacted>
Reviewed-by: Preeti U Murthy <redacted>
---
drivers/cpufreq/powernv-cpufreq.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
Hi Viresh,
On Fri, 2014-08-29 at 05:33 +0530, Viresh Kumar wrote:
On 28 August 2014 19:36, Shilpasri G Bhat
[off-list ref] wrote:
quoted
Changes v1->v2:
Invoke .target() driver callback to set the cpus to nominal frequency
in reboot notifier, instead of calling cpufreq_suspend() as suggested
by Viresh Kumar.
Modified the commit message.
This changelog will get commited, is this what you want?
quoted
+ if (unlikely(rebooting) && new_index != get_nominal_index())
+ return -EBUSY;
Have you placed the unlikely only around 'rebooting' intentionally or
should it cover whole if statement?
Yes unlikely() should cover the whole if statement. Thank you for pointing it out.
I have corrected my mistake in the below patch.
Thanks and regards,
Shilpa
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 set the cpus to nominal frequncy.
Changes v1->v2:
Invoke .target() driver callback to set the cpus to nominal frequency
in reboot notifier, instead of calling cpufreq_suspend() as suggested
by Viresh Kumar.
Modified the commit message.
Signed-off-by: Shilpasri G Bhat <redacted>
Suggested-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Preeti U Murthy <redacted>
---
drivers/cpufreq/powernv-cpufreq.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
On 1 September 2014 10:48, Shilpa Bhat [off-list ref] wrote:
Hi Viresh,
On Fri, 2014-08-29 at 05:33 +0530, Viresh Kumar wrote:
quoted
On 28 August 2014 19:36, Shilpasri G Bhat
[off-list ref] wrote:
quoted
Changes v1->v2:
Invoke .target() driver callback to set the cpus to nominal frequency
in reboot notifier, instead of calling cpufreq_suspend() as suggested
by Viresh Kumar.
Modified the commit message.
This changelog will get commited, is this what you want?
You skipped replying to this and commited the same mistake again..
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 set the cpus to nominal frequncy.
Changes v1->v2:
Invoke .target() driver callback to set the cpus to nominal frequency
in reboot notifier, instead of calling cpufreq_suspend() as suggested
by Viresh Kumar.
Modified the commit message.
This would get commited in git changelogs and probably you don't want
this. So please place them after the three dash '-' symbols below..
Signed-off-by: Shilpasri G Bhat <redacted>
Suggested-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Preeti U Murthy <redacted>
---
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 set the cpus to nominal frequncy.
Signed-off-by: Shilpasri G Bhat <redacted>
Suggested-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Preeti U Murthy <redacted>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
---
Changes v1->v2:
Invoke .target() driver callback to set the cpus to nominal frequency
in reboot notifier, instead of calling cpufreq_suspend() as suggested
by Viresh Kumar.
Modified the commit message.
drivers/cpufreq/powernv-cpufreq.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
Yes unlikely() should cover the whole if statement...
Actually it probably shouldn't.
You need to look at the generated code with each different set of 'unlikely()'
to see how gcc processes them.
In this case, if 'rebooting' is false you want to 'fall through' on a statically
predicted 'not taken' branch. You don't ever care about the second clause.
With an 'unlikely' covering the entire statement gcc could easily add a
forwards conditional branch (that will be mis-predicted) for the 'rebooting' test.
(Yes, I spent a lot of time getting gcc to generate branches that were
correctly statically predicted for some code where every cycle mattered.)
David
Hi David,
The objdup with an 'unlikely()' covering the entire if statement is as follows:
if (unlikely(rebooting && new_index != get_nominal_index()))
return -EBUSY;
1ac: 2f 89 00 00 cmpwi cr7,r9,0 /* compare rebooting,0 */
1b0: 40 de 00 4c bne- cr7,1fc <.powernv_cpufreq_target_index+0x7c>
The '-' in the instruction bne- specifies an unlikely branch. So gcc has
processed the first clause to be identified as an unlikely branch i.e,
branch to <1fc> (to test the second clause) is unlikely on 'rebooting' not
equal to 0.
1b4: 1f ff 00 0c mulli r31,r31,12
.
. <--- Set the frequency and return --->
.
.
1fc: 3d 22 00 00 addis r9,r2,0 /* test the second clause */
200: 3d 02 00 00 addis r8,r2,0
204: 81 49 00 00 lwz r10,0(r9)
208: 81 28 00 00 lwz r9,0(r8)
20c: 7d 29 50 50 subf r9,r9,r10
210: 7f 89 f8 00 cmpw cr7,r9,r31 /* compare new_index,nominal_index */
214: 41 9e ff a0 beq+ cr7,1b4 <.powernv_cpufreq_target_index+0x34>
The '+' in the instruction beq+ specifies a likely branch. The second clause
unlikely(new_index != get_nominal_index()) is processed to
likely(new_index == get_nominal_index()).
218: 38 60 ff f0 li r3,-16 /* return -EBUSY */
21c: 4b ff ff cc b 1e8 <.powernv_cpufreq_target_index+0x68>
So unlikely() covering the entire statement will not lead to a branch mis-prediction
for the 'rebooting' test. Having unlikely to cover both 'rebooting' and the second
clause we can avoid the branch miss prediction for the second clause. This is
advantageous for the code path powernv_cpufreq_target_index(policy,nominal_index)
which will be invoked by the reboot_notifier.
Thanks and Regards,
Shilpa