Re: [PATCH v1 0/5] cpuidle: teo: Rework the idle state selection logic
From: Doug Smythies <hidden>
Date: 2021-07-30 03:37:01
Also in:
lkml
On Thu, Jul 29, 2021 at 9:14 AM Rafael J. Wysocki [off-list ref] wrote:
... [snip]...
This means that idle state 0 data are disregarded after disabling it and that most likely is because the second loop in teo_select() should be over all states down to idle state 0 (not only down to the first enabled one). So below is an updated patch (not tested yet).
Hi Rafael, This updated patch works great / solves the problem. Tested-by: Doug Smythies <redacted> Thank you very much. ... Doug
quoted hunk ↗ jump to hunk
--- drivers/cpuidle/governors/teo.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) Index: linux-pm/drivers/cpuidle/governors/teo.c ===================================================================--- linux-pm.orig/drivers/cpuidle/governors/teo.c +++ linux-pm/drivers/cpuidle/governors/teo.c@@ -397,32 +397,34 @@ static int teo_select(struct cpuidle_dri intercept_sum = 0; recent_sum = 0; - for (i = idx - 1; i >= idx0; i--) { + for (i = idx - 1; i >= 0; i--) { struct teo_bin *bin = &cpu_data->state_bins[i]; s64 span_ns; intercept_sum += bin->intercepts; recent_sum += bin->recent; - if (dev->states_usage[i].disable) + if (dev->states_usage[i].disable && i > 0) continue; span_ns = teo_middle_of_bin(i, drv); - if (!teo_time_ok(span_ns)) { - /* - * The current state is too shallow, so select - * the first enabled deeper state. - */ - duration_ns = last_enabled_span_ns; - idx = last_enabled_idx; - break; - } if ((!alt_recent || 2 * recent_sum > idx_recent_sum) && (!alt_intercepts || 2 * intercept_sum > idx_intercept_sum)) { - idx = i; - duration_ns = span_ns; + if (!teo_time_ok(span_ns) || + dev->states_usage[i].disable) { + /* + * The current state is too shallow or + * disabled, so select the first enabled + * deeper state. + */ + duration_ns = last_enabled_span_ns; + idx = last_enabled_idx; + } else { + idx = i; + duration_ns = span_ns; + } break; }