]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpuidle: governors: teo: Avoid selecting states with zero-size bins
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 14 Jan 2026 19:44:04 +0000 (20:44 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 23 Jan 2026 20:49:54 +0000 (21:49 +0100)
If the last two enabled idle states have the same target residency which
is at least equal to TICK_NSEC, teo may select the next-to-last one even
though the size of that state's bin is 0, which is confusing.

Prevent that from happening by adding a target residency check to the
relevant code path.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Christian Loehle <christian.loehle@arm.com>
[ rjw: Fixed a typo in the changelog ]
Link: https://patch.msgid.link/3033265.e9J7NaK4W3@rafael.j.wysocki
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpuidle/governors/teo.c

index 81ac5fd58a1c6955be7ad1a1a6e44fb6c7626715..9820ef36a664969f25f5077bf3008465af67eae4 100644 (file)
@@ -388,6 +388,15 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
                        while (min_idx < idx &&
                               drv->states[min_idx].target_residency_ns < TICK_NSEC)
                                min_idx++;
+
+                       /*
+                        * Avoid selecting a state with a lower index, but with
+                        * the same target residency as the current candidate
+                        * one.
+                        */
+                       if (drv->states[min_idx].target_residency_ns ==
+                                       drv->states[idx].target_residency_ns)
+                               goto constraint;
                }
 
                /*
@@ -410,6 +419,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
                }
        }
 
+constraint:
        /*
         * If there is a latency constraint, it may be necessary to select an
         * idle state shallower than the current candidate one.