diff mbox

x86 intel power: Initialize MSR_IA32_ENERGY_PERF_BIAS

Message ID alpine.LFD.2.02.1103301819250.31342@x980 (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Len Brown March 30, 2011, 10:21 p.m. UTC
None

Comments

Ingo Molnar April 14, 2011, 9:08 a.m. UTC | #1
* Len Brown <lenb@kernel.org> wrote:

> From: Len Brown <len.brown@intel.com>
> 
> Since 2.6.35 (23016bf0d25), Linux prints the existence of "epb" in /proc/cpuinfo,
> Since 2.6.38 (d5532ee7b40), the x86_energy_perf_policy(8) utility is available
> in-tree to update MSR_IA32_ENERGY_PERF_BIAS.
> 
> However, the typical BIOS fails to initialize the MSR,
> and the typical Linux distro neglects to invoke x86_energy_perf_policy(8).
> 
> The result is that some modern hardware is running in hardware default,
> which is "performance" mode, rather than the intended design default
> of "normal" mode.
> 
> Initialize the MSR to the "normal" setting during kernel boot.
> 
> Of course, x86_energy_perf_policy(8) is available to change
> the default after boot, should the user have a policy preference.
> 
> cc: stable@kernel.org
> Signed-off-by: Len Brown <len.brown@intel.com>
> ---
>  arch/x86/include/asm/msr-index.h |    3 +++
>  arch/x86/kernel/cpu/intel.c      |   14 ++++++++++++++
>  2 files changed, 17 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
> index 43a18c7..91fedd9 100644
> --- a/arch/x86/include/asm/msr-index.h
> +++ b/arch/x86/include/asm/msr-index.h
> @@ -250,6 +250,9 @@
>  #define MSR_IA32_TEMPERATURE_TARGET	0x000001a2
>  
>  #define MSR_IA32_ENERGY_PERF_BIAS	0x000001b0
> +#define ENERGY_PERF_BIAS_PERFORMANCE	0
> +#define ENERGY_PERF_BIAS_NORMAL		6
> +#define ENERGY_PERF_BIAS_POWERSWAVE	15
>  
>  #define MSR_IA32_PACKAGE_THERM_STATUS		0x000001b1
>  
> diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
> index d16c2c5..48cca4a 100644
> --- a/arch/x86/kernel/cpu/intel.c
> +++ b/arch/x86/kernel/cpu/intel.c
> @@ -448,6 +448,20 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
>  
>  	if (cpu_has(c, X86_FEATURE_VMX))
>  		detect_vmx_virtcap(c);
> +
> +	/*
> +	 * Initialize MSR_IA32_ENERGY_PERF_BIAS if BIOS did not.
> +	 * x86_energy_perf_policy(8) is available to change it at run-time
> +	 */
> +	if (cpu_has(c, X86_FEATURE_EPB)) {
> +		u64 epb;
> +
> +		rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
> +		if ((epb & 0xF) == 0) {
> +			epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL;
> +			wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
> +		}
> +	}

Dunno, this patch appears to silently modify the system to be slower than it 
was before under Linux.

Won't people report this as a regression if this change reduces performance for 
them?

They wont be able to see your comments in the code and in the changelog either, 
when this happens to them. They might look into /proc/cpuinfo and see 'epb' 
there but it wont tell them anything. They wont know about a utility available 
in tools/power/x86/ either.

So this patch has 'future trouble' written all over it i'm afraid.

Thanks,

	Ingo
Len Brown April 15, 2011, 6:25 a.m. UTC | #2
> > From: Len Brown <len.brown@intel.com>
> > 
> > Since 2.6.35 (23016bf0d25), Linux prints the existence of "epb" in /proc/cpuinfo,
> > Since 2.6.38 (d5532ee7b40), the x86_energy_perf_policy(8) utility is available
> > in-tree to update MSR_IA32_ENERGY_PERF_BIAS.
> > 
> > However, the typical BIOS fails to initialize the MSR,
> > and the typical Linux distro neglects to invoke x86_energy_perf_policy(8).
> > 
> > The result is that some modern hardware is running in hardware default,
> > which is "performance" mode, rather than the intended design default
> > of "normal" mode.
> > 
> > Initialize the MSR to the "normal" setting during kernel boot.
> > 
> > Of course, x86_energy_perf_policy(8) is available to change
> > the default after boot, should the user have a policy preference.
> > 
> > cc: stable@kernel.org
> > Signed-off-by: Len Brown <len.brown@intel.com>
> > ---
> >  arch/x86/include/asm/msr-index.h |    3 +++
> >  arch/x86/kernel/cpu/intel.c      |   14 ++++++++++++++
> >  2 files changed, 17 insertions(+), 0 deletions(-)
> > 
...
> 
> Dunno, this patch appears to silently modify the system to be slower than it 
> was before under Linux.
> 
> Won't people report this as a regression if this change reduces performance for 
> them?
> 
> They wont be able to see your comments in the code and in the changelog either, 
> when this happens to them. They might look into /proc/cpuinfo and see 'epb' 
> there but it wont tell them anything. They wont know about a utility available 
> in tools/power/x86/ either.

This patch makes no change to the epb feature indicator
/proc/cpuinfo.

> So this patch has 'future trouble' written all over it i'm afraid.

EPB is limited to SNB and later.
So the installed base as yet is small.
(it also exists on WSM-EP, but doesn't do so much there)
EPB will have a more significant effect on future hardware.

Linux currently trails competing operating systems in energy
efficiency on SNB due to this setting, and Linux will trail
competing operating systems even more on future hardware
if this default is not fixed.

Will it be possible to measure a performance difference between
"performance" and "normal"?  Yes, it will be possible.
Will 99.9% of users notice?  Nope.  More likely they'll notice
the the power savings that are disabled in "performance" mode.

I should have called it "benchmark" mode instead of "performance" mode...

thanks,
Len Brown, Intel Open Source Technology Center
Ingo Molnar April 15, 2011, 10:17 a.m. UTC | #3
* Len Brown <lenb@kernel.org> wrote:

> 
> > > From: Len Brown <len.brown@intel.com>
> > > 
> > > Since 2.6.35 (23016bf0d25), Linux prints the existence of "epb" in /proc/cpuinfo,
> > > Since 2.6.38 (d5532ee7b40), the x86_energy_perf_policy(8) utility is available
> > > in-tree to update MSR_IA32_ENERGY_PERF_BIAS.
> > > 
> > > However, the typical BIOS fails to initialize the MSR,
> > > and the typical Linux distro neglects to invoke x86_energy_perf_policy(8).
> > > 
> > > The result is that some modern hardware is running in hardware default,
> > > which is "performance" mode, rather than the intended design default
> > > of "normal" mode.
> > > 
> > > Initialize the MSR to the "normal" setting during kernel boot.
> > > 
> > > Of course, x86_energy_perf_policy(8) is available to change
> > > the default after boot, should the user have a policy preference.
> > > 
> > > cc: stable@kernel.org
> > > Signed-off-by: Len Brown <len.brown@intel.com>
> > > ---
> > >  arch/x86/include/asm/msr-index.h |    3 +++
> > >  arch/x86/kernel/cpu/intel.c      |   14 ++++++++++++++
> > >  2 files changed, 17 insertions(+), 0 deletions(-)
> > > 
> ...
> > 
> > Dunno, this patch appears to silently modify the system to be slower than it 
> > was before under Linux.
> > 
> > Won't people report this as a regression if this change reduces performance for 
> > them?
> > 
> > They wont be able to see your comments in the code and in the changelog either, 
> > when this happens to them. They might look into /proc/cpuinfo and see 'epb' 
> > there but it wont tell them anything. They wont know about a utility available 
> > in tools/power/x86/ either.
> 
> This patch makes no change to the epb feature indicator
> /proc/cpuinfo.

I know. I reacted to this bit in the changelog:

> > > Since 2.6.35 (23016bf0d25), Linux prints the existence of "epb" in /proc/cpuinfo,

Printing the existence of a CPU feature does nothing to inform users.

> > So this patch has 'future trouble' written all over it i'm afraid.
> 
> EPB is limited to SNB and later.
> So the installed base as yet is small.
> (it also exists on WSM-EP, but doesn't do so much there)
> EPB will have a more significant effect on future hardware.
> 
> Linux currently trails competing operating systems in energy
> efficiency on SNB due to this setting, and Linux will trail
> competing operating systems even more on future hardware
> if this default is not fixed.
> 
> Will it be possible to measure a performance difference between
> "performance" and "normal"?  Yes, it will be possible.
> Will 99.9% of users notice?  Nope.  More likely they'll notice
> the the power savings that are disabled in "performance" mode.
> 
> I should have called it "benchmark" mode instead of "performance" mode...

That's all fair but does not address the concerns i raised. A silent change 
during bootup is asking for trouble.

So how about informing users, how about making it non-silent? An informative 
printk that also mentions the power configuration tool, etc. This solves the 
concerns i mentioned.

Thanks,

	Ingo
Len Brown July 13, 2011, 8:44 p.m. UTC | #4
> So how about informing users, how about making it non-silent? An informative 
> printk that also mentions the power configuration tool, etc. This solves the 
> concerns i mentioned.

Something like this?

                rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
                if ((epb & 0xF) == 0) {
                        printk_once(KERN_WARN, "x86: updated energy_perf_bias"
                                " to 'normal' from 'performance'\n"
                                "You can view and update epb via utility,"
                                " such as x86_energy_perf_policy(8)\n");
                        epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL;
                        wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
                }
Linus Torvalds July 13, 2011, 8:49 p.m. UTC | #5
Ack. Let's just do this. Ingo?

            Linus

On Wed, Jul 13, 2011 at 1:44 PM, Len Brown <lenb@kernel.org> wrote:
>
>> So how about informing users, how about making it non-silent? An informative
>> printk that also mentions the power configuration tool, etc. This solves the
>> concerns i mentioned.
>
> Something like this?
>
>                rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
>                if ((epb & 0xF) == 0) {
>                        printk_once(KERN_WARN, "x86: updated energy_perf_bias"
>                                " to 'normal' from 'performance'\n"
>                                "You can view and update epb via utility,"
>                                " such as x86_energy_perf_policy(8)\n");
>                        epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL;
>                        wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
>                }
>
>
Len Brown July 13, 2011, 8:51 p.m. UTC | #6
> Ok. So... what "serious bug" does this fix? You really need to use cc:
> stable less. Tweaking performance/power ratio is _not_ serious bug.

While the performance difference may not be significant,
the energy difference may be.

Some people think it is serious when Linux has worse out-of-box
energy efficiency than Windows on the same hardware.

Some people think that it is serious when their Linux distribution
has worse energy efficiency than competing Linux distributions.

Greg has given me a hard time for not cc'ing stable _enough_.
I guess the folks that answer the stable mail get to decide...

cheers,
-Len
H. Peter Anvin July 13, 2011, 9:38 p.m. UTC | #7
On 07/13/2011 01:49 PM, Linus Torvalds wrote:
> Ack. Let's just do this. Ingo?
> 
>             Linus

Ingo is travelling this week, but this seems to have converged.

	-hpa
diff mbox

Patch

diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h
index 43a18c7..91fedd9 100644
--- a/arch/x86/include/asm/msr-index.h
+++ b/arch/x86/include/asm/msr-index.h
@@ -250,6 +250,9 @@ 
 #define MSR_IA32_TEMPERATURE_TARGET	0x000001a2
 
 #define MSR_IA32_ENERGY_PERF_BIAS	0x000001b0
+#define ENERGY_PERF_BIAS_PERFORMANCE	0
+#define ENERGY_PERF_BIAS_NORMAL		6
+#define ENERGY_PERF_BIAS_POWERSWAVE	15
 
 #define MSR_IA32_PACKAGE_THERM_STATUS		0x000001b1
 
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index d16c2c5..48cca4a 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -448,6 +448,20 @@  static void __cpuinit init_intel(struct cpuinfo_x86 *c)
 
 	if (cpu_has(c, X86_FEATURE_VMX))
 		detect_vmx_virtcap(c);
+
+	/*
+	 * Initialize MSR_IA32_ENERGY_PERF_BIAS if BIOS did not.
+	 * x86_energy_perf_policy(8) is available to change it at run-time
+	 */
+	if (cpu_has(c, X86_FEATURE_EPB)) {
+		u64 epb;
+
+		rdmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
+		if ((epb & 0xF) == 0) {
+			epb = (epb & ~0xF) | ENERGY_PERF_BIAS_NORMAL;
+			wrmsrl(MSR_IA32_ENERGY_PERF_BIAS, epb);
+		}
+	}
 }
 
 #ifdef CONFIG_X86_32