Commit 094a7c31 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branch 'pm-cpuidle'

Merge a menu governor fix for 6.17-rc3

* pm-cpuidle:
  cpuidle: governors: menu: Avoid selecting states with too much latency
parents 2bc1adb0 779b1a1c
Loading
Loading
Loading
Loading
+12 −17
Original line number Diff line number Diff line
@@ -287,20 +287,15 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
		return 0;
	}

	if (tick_nohz_tick_stopped()) {
	/*
		 * If the tick is already stopped, the cost of possible short
		 * idle duration misprediction is much higher, because the CPU
		 * may be stuck in a shallow idle state for a long time as a
		 * result of it.  In that case say we might mispredict and use
		 * the known time till the closest timer event for the idle
		 * state selection.
	 * If the tick is already stopped, the cost of possible short idle
	 * duration misprediction is much higher, because the CPU may be stuck
	 * in a shallow idle state for a long time as a result of it.  In that
	 * case, say we might mispredict and use the known time till the closest
	 * timer event for the idle state selection.
	 */
		if (predicted_ns < TICK_NSEC)
	if (tick_nohz_tick_stopped() && predicted_ns < TICK_NSEC)
		predicted_ns = data->next_timer_ns;
	} else if (latency_req > predicted_ns) {
		latency_req = predicted_ns;
	}

	/*
	 * Find the idle state with the lowest power while satisfying
@@ -316,13 +311,15 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
		if (idx == -1)
			idx = i; /* first enabled state */

		if (s->exit_latency_ns > latency_req)
			break;

		if (s->target_residency_ns > predicted_ns) {
			/*
			 * Use a physical idle state, not busy polling, unless
			 * a timer is going to trigger soon enough.
			 */
			if ((drv->states[idx].flags & CPUIDLE_FLAG_POLLING) &&
			    s->exit_latency_ns <= latency_req &&
			    s->target_residency_ns <= data->next_timer_ns) {
				predicted_ns = s->target_residency_ns;
				idx = i;
@@ -354,8 +351,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,

			return idx;
		}
		if (s->exit_latency_ns > latency_req)
			break;

		idx = i;
	}