[PATCH] linux-2.6.5-rc1_cpukhz-fix_A0.patch

john stultz
2004-03-18T20:55:53Z

On Wed, 2004-03-17 at 01:50, Dominik Brodowski wrote:
> On Tue, Mar 16, 2004 at 04:46:54PM -0800, john stultz wrote:
> > On Tue, 2004-03-16 at 15:33, Dominik Brodowski wrote:
> > > On Tue, Mar 16, 2004 at 03:28:15PM -0800, john stultz wrote:
> > > > On Tue, 2004-03-16 at 13:42, Karol Kozimor wrote:
> > > > > Thus wrote Daniele Venzano:
> > > > > > > I have a notebook with an Athlon-M CPU. I tried linux 2.6.4 with
> > > > > > > CONFIG_X86_PM_TIMER=y and I noticed that /proc/cpuinfo doesn't get
> > > > > > > updated when I switch frequency (via sysfs, using powernow-k7). The is
> > > > > > > issue seems cosmetic only, CPU frequency changes (watching
> > > > > > > temperature/battery life).
> > > > > > I can confirm, I'm seeing the same behavior. Please note that the
> > > > > > bogomips count gets updated, it's only the frequency that doesn't
> > > > > > change.
> > > > >
> > > > > Same here with a P4-M, follow-up to John and Dmitry.
> > > >
> > > > Hmm. This is untested, but I think this should do the trick.
> > > >
> > > > Dominik: Is there any reason I'm not seeing why cpu_khz should only be
> > > > updated when using the TSC?
> > >
> > > Is cpu_khz always correct (or, at least, nonzero) when we're reaching this
> > > code path?
> >
> > Using the PIT time source, cpu_khz is zero, so maybe it should be
> > conditional on if(cpu_khz)?
>
> That will do the trick.

Patch below.

This small patch insures that cpu_khz is adjusted on cpufreq
notifications even when the tsc timesource is not in use. It fixes the
mostly cosmetic issue when using the ACPI PM timesource of /proc/cpuinfo
not being properly updated when cpu frequency was lowered.

Please let me know if you have any additional feedback.

thanks
-john

diff -Nru a/arch/i386/kernel/timers/timer_tsc.c b/arch/i386/kernel/timers/timer_tsc.c
--- a/arch/i386/kernel/timers/timer_tsc.c Thu Mar 18 12:50:08 2004
+++ b/arch/i386/kernel/timers/timer_tsc.c Thu Mar 18 12:50:08 2004
@@ -360,8 +360,9 @@
if (variable_tsc)
cpu_data[freq->cpu].loops_per_jiffy = cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
#ifndef CONFIG_SMP
- if (use_tsc) {
+ if(cpu_khz)
cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new);
+ if (use_tsc) {
if (variable_tsc) {
fast_gettimeoffset_quotient = cpufreq_scale(fast_gettimeoffset_ref, freq->new, ref_freq);
set_cyc2ns_scale(cpu_khz/1000);