Skip to content

Commit 154ae8b

Browse files
committed
cpuidle: teo: Use kerneldoc documentation in admin-guide
There are two descriptions of the TEO (Timer Events Oriented) cpuidle governor in the kernel source tree, one in the C file containing its code and one in cpuidle.rst which is part of admin-guide. Instead of trying to keep them both in sync and in order to reduce text duplication, include the governor description from the C file directly into cpuidle.rst. Signed-off-by: Rafael J. Wysocki <[email protected]>
1 parent 7757755 commit 154ae8b

File tree

2 files changed

+10
-79
lines changed

2 files changed

+10
-79
lines changed

Documentation/admin-guide/pm/cpuidle.rst

Lines changed: 2 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -347,81 +347,8 @@ for tickless systems. It follows the same basic strategy as the ``menu`` `one
347347
<menu-gov_>`_: it always tries to find the deepest idle state suitable for the
348348
given conditions. However, it applies a different approach to that problem.
349349

350-
First, it does not use sleep length correction factors, but instead it attempts
351-
to correlate the observed idle duration values with the available idle states
352-
and use that information to pick up the idle state that is most likely to
353-
"match" the upcoming CPU idle interval. Second, it does not take the tasks
354-
that were running on the given CPU in the past and are waiting on some I/O
355-
operations to complete now at all (there is no guarantee that they will run on
356-
the same CPU when they become runnable again) and the pattern detection code in
357-
it avoids taking timer wakeups into account. It also only uses idle duration
358-
values less than the current time till the closest timer (with the scheduler
359-
tick excluded) for that purpose.
360-
361-
Like in the ``menu`` governor `case <menu-gov_>`_, the first step is to obtain
362-
the *sleep length*, which is the time until the closest timer event with the
363-
assumption that the scheduler tick will be stopped (that also is the upper bound
364-
on the time until the next CPU wakeup). That value is then used to preselect an
365-
idle state on the basis of three metrics maintained for each idle state provided
366-
by the ``CPUIdle`` driver: ``hits``, ``misses`` and ``early_hits``.
367-
368-
The ``hits`` and ``misses`` metrics measure the likelihood that a given idle
369-
state will "match" the observed (post-wakeup) idle duration if it "matches" the
370-
sleep length. They both are subject to decay (after a CPU wakeup) every time
371-
the target residency of the idle state corresponding to them is less than or
372-
equal to the sleep length and the target residency of the next idle state is
373-
greater than the sleep length (that is, when the idle state corresponding to
374-
them "matches" the sleep length). The ``hits`` metric is increased if the
375-
former condition is satisfied and the target residency of the given idle state
376-
is less than or equal to the observed idle duration and the target residency of
377-
the next idle state is greater than the observed idle duration at the same time
378-
(that is, it is increased when the given idle state "matches" both the sleep
379-
length and the observed idle duration). In turn, the ``misses`` metric is
380-
increased when the given idle state "matches" the sleep length only and the
381-
observed idle duration is too short for its target residency.
382-
383-
The ``early_hits`` metric measures the likelihood that a given idle state will
384-
"match" the observed (post-wakeup) idle duration if it does not "match" the
385-
sleep length. It is subject to decay on every CPU wakeup and it is increased
386-
when the idle state corresponding to it "matches" the observed (post-wakeup)
387-
idle duration and the target residency of the next idle state is less than or
388-
equal to the sleep length (i.e. the idle state "matching" the sleep length is
389-
deeper than the given one).
390-
391-
The governor walks the list of idle states provided by the ``CPUIdle`` driver
392-
and finds the last (deepest) one with the target residency less than or equal
393-
to the sleep length. Then, the ``hits`` and ``misses`` metrics of that idle
394-
state are compared with each other and it is preselected if the ``hits`` one is
395-
greater (which means that that idle state is likely to "match" the observed idle
396-
duration after CPU wakeup). If the ``misses`` one is greater, the governor
397-
preselects the shallower idle state with the maximum ``early_hits`` metric
398-
(or if there are multiple shallower idle states with equal ``early_hits``
399-
metric which also is the maximum, the shallowest of them will be preselected).
400-
[If there is a wakeup latency constraint coming from the `PM QoS framework
401-
<cpu-pm-qos_>`_ which is hit before reaching the deepest idle state with the
402-
target residency within the sleep length, the deepest idle state with the exit
403-
latency within the constraint is preselected without consulting the ``hits``,
404-
``misses`` and ``early_hits`` metrics.]
405-
406-
Next, the governor takes several idle duration values observed most recently
407-
into consideration and if at least a half of them are greater than or equal to
408-
the target residency of the preselected idle state, that idle state becomes the
409-
final candidate to ask for. Otherwise, the average of the most recent idle
410-
duration values below the target residency of the preselected idle state is
411-
computed and the governor walks the idle states shallower than the preselected
412-
one and finds the deepest of them with the target residency within that average.
413-
That idle state is then taken as the final candidate to ask for.
414-
415-
Still, at this point the governor may need to refine the idle state selection if
416-
it has not decided to `stop the scheduler tick <idle-cpus-and-tick_>`_. That
417-
generally happens if the target residency of the idle state selected so far is
418-
less than the tick period and the tick has not been stopped already (in a
419-
previous iteration of the idle loop). Then, like in the ``menu`` governor
420-
`case <menu-gov_>`_, the sleep length used in the previous computations may not
421-
reflect the real time until the closest timer event and if it really is greater
422-
than that time, a shallower state with a suitable target residency may need to
423-
be selected.
424-
350+
.. kernel-doc:: drivers/cpuidle/governors/teo.c
351+
:doc: teo-description
425352

426353
.. _idle-states-representation:
427354

drivers/cpuidle/governors/teo.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
*
55
* Copyright (C) 2018 - 2021 Intel Corporation
66
* Author: Rafael J. Wysocki <[email protected]>
7+
*/
8+
9+
/**
10+
* DOC: teo-description
711
*
812
* The idea of this governor is based on the observation that on many systems
913
* timer events are two or more orders of magnitude more frequent than any
@@ -28,7 +32,7 @@
2832
*
2933
* The computations carried out by this governor are based on using bins whose
3034
* boundaries are aligned with the target residency parameter values of the CPU
31-
* idle states provided by the cpuidle driver in the ascending order. That is,
35+
* idle states provided by the %CPUIdle driver in the ascending order. That is,
3236
* the first bin spans from 0 up to, but not including, the target residency of
3337
* the second idle state (idle state 1), the second bin spans from the target
3438
* residency of idle state 1 up to, but not including, the target residency of
@@ -51,8 +55,8 @@
5155
* situations are referred to as "intercepts" below).
5256
*
5357
* In addition to the metrics described above, the governor counts recent
54-
* intercepts (that is, intercepts that have occurred during the last NR_RECENT
55-
* invocations of it for the given CPU) for each bin.
58+
* intercepts (that is, intercepts that have occurred during the last
59+
* %NR_RECENT invocations of it for the given CPU) for each bin.
5660
*
5761
* In order to select an idle state for a CPU, the governor takes the following
5862
* steps (modulo the possible latency constraint that must be taken into account
@@ -76,7 +80,7 @@
7680
* shallower than the candidate one.
7781
*
7882
* 2. If the second sum is greater than the first one or the third sum is
79-
* greater than NR_RECENT / 2, the CPU is likely to wake up early, so look
83+
* greater than %NR_RECENT / 2, the CPU is likely to wake up early, so look
8084
* for an alternative idle state to select.
8185
*
8286
* - Traverse the idle states shallower than the candidate one in the

0 commit comments

Comments
 (0)