Commit 27f85088 authored by Kajetan Puchalski's avatar Kajetan Puchalski Committed by Rafael J. Wysocki
Browse files

cpuidle: teo: Optionally skip polling states in teo_find_shallower_state()



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: default avatarKajetan Puchalski <kajetan.puchalski@arm.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent b7bfaa76
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -258,15 +258,17 @@ static s64 teo_middle_of_bin(int idx, struct cpuidle_driver *drv)
 * @dev: Target CPU.
 * @dev: Target CPU.
 * @state_idx: Index of the capping idle state.
 * @state_idx: Index of the capping idle state.
 * @duration_ns: Idle duration value to match.
 * @duration_ns: Idle duration value to match.
 * @no_poll: Don't consider polling states.
 */
 */
static int teo_find_shallower_state(struct cpuidle_driver *drv,
static int teo_find_shallower_state(struct cpuidle_driver *drv,
				    struct cpuidle_device *dev, int state_idx,
				    struct cpuidle_device *dev, int state_idx,
				    s64 duration_ns)
				    s64 duration_ns, bool no_poll)
{
{
	int i;
	int i;


	for (i = state_idx - 1; i >= 0; 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;
			continue;


		state_idx = i;
		state_idx = i;
@@ -469,7 +471,7 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
		 */
		 */
		if (idx > idx0 &&
		if (idx > idx0 &&
		    drv->states[idx].target_residency_ns > delta_tick)
		    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;
	return idx;