[patch] powerpc: estimate G5 cpufreq transition latency
Benjamin Herrenschmidt
benh at kernel.crashing.org
Mon Feb 23 14:54:28 EST 2009
On Thu, 2009-02-19 at 18:07 +0100, Nick Piggin wrote:
> Setting G5's cpu frequency transition latency to CPUFREQ_ETERNAL stops
> ondemand governor from working. I measured the latency using sched_clock
> and haven't seen much higher than 11000ns, so I set this to 12000ns for
> my configuration. Possibly other configurations will be different?
> Ideally the generic code would be able to measure it in case the platform
> does not provide it.
>
> But this simple patch at least makes it throttle again.
>
> Signed-off-by: Nick Piggin <npiggin at suse.de>
> ---
Oh well, I've never used ondemand but some userspace stuff instead :-)
No objection appart from the change to drivers/cpufreq/cpufreq.c which
should be in a separate patch to whoever maintains that code :-)
Cheers,
Ben.
> Index: linux-2.6/arch/powerpc/platforms/powermac/cpufreq_64.c
> ===================================================================
> --- linux-2.6.orig/arch/powerpc/platforms/powermac/cpufreq_64.c 2009-02-20 01:42:41.000000000 +1100
> +++ linux-2.6/arch/powerpc/platforms/powermac/cpufreq_64.c 2009-02-20 01:50:15.000000000 +1100
> @@ -86,6 +86,7 @@
>
> static DEFINE_MUTEX(g5_switch_mutex);
>
> +static unsigned long transition_latency;
>
> #ifdef CONFIG_PMAC_SMU
>
> @@ -357,7 +358,7 @@
>
> static int g5_cpufreq_cpu_init(struct cpufreq_policy *policy)
> {
> - policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
> + policy->cpuinfo.transition_latency = transition_latency;
> policy->cur = g5_cpu_freqs[g5_query_freq()].frequency;
> /* secondary CPUs are tied to the primary one by the
> * cpufreq core if in the secondary policy we tell it that
> @@ -500,6 +501,7 @@
> g5_cpu_freqs[1].frequency = max_freq/2;
>
> /* Set callbacks */
> + transition_latency = 12000;
> g5_switch_freq = g5_scom_switch_freq;
> g5_query_freq = g5_scom_query_freq;
> freq_method = "SCOM";
> @@ -675,6 +677,7 @@
> g5_cpu_freqs[1].frequency = min_freq;
>
> /* Set callbacks */
> + transition_latency = CPUFREQ_ETERNAL;
> g5_switch_volt = g5_pfunc_switch_volt;
> g5_switch_freq = g5_pfunc_switch_freq;
> g5_query_freq = g5_pfunc_query_freq;
> Index: linux-2.6/drivers/cpufreq/cpufreq.c
> ===================================================================
> --- linux-2.6.orig/drivers/cpufreq/cpufreq.c 2009-02-20 01:42:43.000000000 +1100
> +++ linux-2.6/drivers/cpufreq/cpufreq.c 2009-02-20 01:50:15.000000000 +1100
> @@ -1559,9 +1559,11 @@
> else {
> printk(KERN_WARNING "%s governor failed, too long"
> " transition latency of HW, fallback"
> - " to %s governor\n",
> + " to %s governor (latency=%lld max=%lld)\n",
> policy->governor->name,
> - gov->name);
> + gov->name,
> + policy->cpuinfo.transition_latency,
> + policy->governor->max_transition_latency);
> policy->governor = gov;
> }
> }
More information about the Linuxppc-dev
mailing list