Message ID | 20090423072218.102318325@sous-sol.org (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
Am Donnerstag 23 April 2009 schrieb Chris Wright: > -stable review patch. If anyone has any objections, please let us > know. --------------------- > > From: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> > > upstream commit: a59d1637eb0e0a37ee0e5c92800c60abe3624e24 > > Some BIOSes report very high frequency transition latency which are > plainly wrong on CPus that can change frequency using native MSR > interface. > > One such system is IBM T42 (2327-8ZU) as reported by Owen Taylor and > Rik van Riel. > > cpufreq_ondemand driver uses this transition latency to come up with a > reasonable sampling interval to sample CPU usage and with such high > latency value, ondemand sampling interval ends up being very high > (0.5 sec, in this particular case), resulting in performance impact due > to slow response to increasing frequency. > > Fix it by capping-off the transition latency to 20uS for native MSR > based frequency transitions. > > mjg: We've confirmed that this also helps on the X31 > > Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> > Acked-by: Matthew Garrett <mjg@redhat.com> > Signed-off-by: Len Brown <len.brown@intel.com> > Signed-off-by: Chris Wright <chrisw@sous-sol.org> > --- > > arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c > +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c > @@ -680,6 +680,18 @@ static int acpi_cpufreq_cpu_init(struct > perf->states[i].transition_latency * 1000; > } > > + /* Check for high latency (>20uS) from buggy BIOSes, like on T42 */ > + if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE > && + policy->cpuinfo.transition_latency > 20 * 1000) { > + static int print_once; > + policy->cpuinfo.transition_latency = 20 * 1000; > + if (!print_once) { > + print_once = 1; > + printk(KERN_INFO "Capping off P-state tranision latency" typo: tranision => transition > + " at 20 uS\n"); > + } > + } > + > data->max_freq = perf->states[0].core_frequency * 1000; > /* table init */ > for (i=0; i<perf->state_count; i++) {
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c @@ -680,6 +680,18 @@ static int acpi_cpufreq_cpu_init(struct perf->states[i].transition_latency * 1000; } + /* Check for high latency (>20uS) from buggy BIOSes, like on T42 */ + if (perf->control_register.space_id == ACPI_ADR_SPACE_FIXED_HARDWARE && + policy->cpuinfo.transition_latency > 20 * 1000) { + static int print_once; + policy->cpuinfo.transition_latency = 20 * 1000; + if (!print_once) { + print_once = 1; + printk(KERN_INFO "Capping off P-state tranision latency" + " at 20 uS\n"); + } + } + data->max_freq = perf->states[0].core_frequency * 1000; /* table init */ for (i=0; i<perf->state_count; i++) {