Re: [PATCH 6/6] cpufreq: schedutil: New governor based on scheduler utilization data
From: Dietmar Eggemann <dietmar.eggemann@arm.com>
Date: 2016-03-03 17:29:03
Also in:
linux-acpi, lkml
From: Dietmar Eggemann <dietmar.eggemann@arm.com>
Date: 2016-03-03 17:29:03
Also in:
linux-acpi, lkml
On 03/03/16 16:28, Peter Zijlstra wrote:
On Thu, Mar 03, 2016 at 04:38:17PM +0100, Peter Zijlstra wrote:quoted
On Thu, Mar 03, 2016 at 03:01:15PM +0100, Vincent Guittot wrote:quoted
quoted
In case a more formal derivation of this formula is needed, it is based on the following 3 assumptions: (1) Performance is a linear function of frequency. (2) Required performance is a linear function of the utilization ratio x = util/max as provided by the scheduler (0 <= x <= 1).Just to mention that the utilization that you are using, varies with the frequency which add another variable in your equationRight, x86 hasn't implemented arch_scale_freq_capacity(), so the utilization values we use are all over the map. If we lower freq, the util will go up, which would result in us bumping the freq again, etc..Something like the completely untested below should maybe work. Rafael?
[...]
+void arch_scale_freq_tick(void)
+{
+ u64 aperf, mperf;
+ u64 acnt, mcnt;
+
+ if (!static_cpu_has(X86_FEATURE_APERFMPERF))
+ return;
+
+ aperf = rdmsrl(MSR_IA32_APERF);
+ mperf = rdmsrl(MSR_IA32_APERF);
+
+ acnt = aperf - this_cpu_read(arch_prev_aperf);
+ mcnt = mperf - this_cpu_read(arch_prev_mperf);
+
+ this_cpu_write(arch_prev_aperf, aperf);
+ this_cpu_write(arch_prev_mperf, mperf);
+
+ this_cpu_write(arch_cpu_freq, div64_u64(acnt * SCHED_CAPACITY_SCALE, mcnt));Wasn't there the problem that this ratio goes to zero if the cpu is idle in the old power estimation approach on x86? [...]