Thread (17 messages) 17 messages, 3 authors, 2021-07-30

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;
                        }
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help