Commit 6da8f9ba authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

cpuidle: teo: Skip tick_nohz_get_sleep_length() call in some cases



Make teo_select() avoid calling tick_nohz_get_sleep_length() if the
candidate idle state to return is state 0 or if state 0 is a polling
one and the target residency of the current candidate one is below
a certain threshold, in which cases it may be assumed that the CPU will
be woken up immediately by a non-timer wakeup source and the timers
are not likely to matter.

Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: default avatarKajetan Puchalski <kajetan.puchalski@arm.com>
Tested-by: default avatarAnna-Maria Behnsen <anna-maria@linutronix.de>
parent 21d28cd2
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -166,6 +166,12 @@
 */
#define NR_RECENT	9

/*
 * Idle state target residency threshold used for deciding whether or not to
 * check the time till the closest expected timer event.
 */
#define RESIDENCY_THRESHOLD_NS	(15 * NSEC_PER_USEC)

/**
 * struct teo_bin - Metrics used by the TEO cpuidle governor.
 * @intercepts: The "intercepts" metric.
@@ -542,6 +548,22 @@ static int teo_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
			idx = i;
	}

	/*
	 * Skip the timers check if state 0 is the current candidate one,
	 * because an immediate non-timer wakeup is expected in that case.
	 */
	if (!idx)
		goto out_tick;

	/*
	 * If state 0 is a polling one, check if the target residency of
	 * the current candidate state is low enough and skip the timers
	 * check in that case too.
	 */
	if ((drv->states[0].flags & CPUIDLE_FLAG_POLLING) &&
	    drv->states[idx].target_residency_ns < RESIDENCY_THRESHOLD_NS)
		goto out_tick;

	duration_ns = tick_nohz_get_sleep_length(&delta_tick);
	cpu_data->sleep_length_ns = duration_ns;