cpuidle: teo: Optionally skip polling states in teo_find_shallower_state()
authorKajetan Puchalski <kajetan.puchalski@arm.com>
Thu, 5 Jan 2023 14:51:58 +0000 (14:51 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 10 Jan 2023 19:53:22 +0000 (20:53 +0100)
Add a no_poll flag to teo_find_shallower_state() that will let the
function optionally not consider polling states.

This allows the caller to guard against the function inadvertently
resulting in TEO putting the CPU in a polling state when that
behaviour is undesirable.

Signed-off-by: Kajetan Puchalski <kajetan.puchalski@arm.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpuidle/governors/teo.c

index d9262db..e286447 100644 (file)
@@ -258,15 +258,17 @@ static s64 teo_middle_of_bin(int idx, struct cpuidle_driver *drv)
  * @dev: Target CPU.
  * @state_idx: Index of the capping idle state.
  * @duration_ns: Idle duration value to match.
+ * @no_poll: Don't consider polling states.
  */
 static int teo_find_shallower_state(struct cpuidle_driver *drv,
                                    struct cpuidle_device *dev, int state_idx,
-                                   s64 duration_ns)
+                                   s64 duration_ns, bool no_poll)
 {
        int i;
 
        for (i = state_idx - 1; i >= 0; i--) {
-               if (dev->states_usage[i].disable)
+               if (dev->states_usage[i].disable ||
+                               (no_poll && drv->states[i].flags & CPUIDLE_FLAG_POLLING))
                        continue;
 
                state_idx = i;
@@ -469,7 +471,7 @@ end:
                 */
                if (idx > idx0 &&
                    drv->states[idx].target_residency_ns > delta_tick)
-                       idx = teo_find_shallower_state(drv, dev, idx, delta_tick);
+                       idx = teo_find_shallower_state(drv, dev, idx, delta_tick, false);
        }
 
        return idx;