xref: /linux/Documentation/trace/rv/monitor_sched.rst (revision 88221ac0d560700b50493aedc768f728aa585141)
1*03abeaa6SGabriele MonacoScheduler monitors
2*03abeaa6SGabriele Monaco==================
3*03abeaa6SGabriele Monaco
4*03abeaa6SGabriele Monaco- Name: sched
5*03abeaa6SGabriele Monaco- Type: container for multiple monitors
6*03abeaa6SGabriele Monaco- Author: Gabriele Monaco <gmonaco@redhat.com>, Daniel Bristot de Oliveira <bristot@kernel.org>
7*03abeaa6SGabriele Monaco
8*03abeaa6SGabriele MonacoDescription
9*03abeaa6SGabriele Monaco-----------
10*03abeaa6SGabriele Monaco
11*03abeaa6SGabriele MonacoMonitors describing complex systems, such as the scheduler, can easily grow to
12*03abeaa6SGabriele Monacothe point where they are just hard to understand because of the many possible
13*03abeaa6SGabriele Monacostate transitions.
14*03abeaa6SGabriele MonacoOften it is possible to break such descriptions into smaller monitors,
15*03abeaa6SGabriele Monacosharing some or all events. Enabling those smaller monitors concurrently is,
16*03abeaa6SGabriele Monacoin fact, testing the system as if we had one single larger monitor.
17*03abeaa6SGabriele MonacoSplitting models into multiple specification is not only easier to
18*03abeaa6SGabriele Monacounderstand, but gives some more clues when we see errors.
19*03abeaa6SGabriele Monaco
20*03abeaa6SGabriele MonacoThe sched monitor is a set of specifications to describe the scheduler behaviour.
21*03abeaa6SGabriele MonacoIt includes several per-cpu and per-task monitors that work independently to verify
22*03abeaa6SGabriele Monacodifferent specifications the scheduler should follow.
23*03abeaa6SGabriele Monaco
24*03abeaa6SGabriele MonacoTo make this system as straightforward as possible, sched specifications are *nested*
25*03abeaa6SGabriele Monacomonitors, whereas sched itself is a *container*.
26*03abeaa6SGabriele MonacoFrom the interface perspective, sched includes other monitors as sub-directories,
27*03abeaa6SGabriele Monacoenabling/disabling or setting reactors to sched, propagates the change to all monitors,
28*03abeaa6SGabriele Monacohowever single monitors can be used independently as well.
29*03abeaa6SGabriele Monaco
30*03abeaa6SGabriele MonacoIt is important that future modules are built after their container (sched, in
31*03abeaa6SGabriele Monacothis case), otherwise the linker would not respect the order and the nesting
32*03abeaa6SGabriele Monacowouldn't work as expected.
33*03abeaa6SGabriele MonacoTo do so, simply add them after sched in the Makefile.
34*03abeaa6SGabriele Monaco
35*03abeaa6SGabriele MonacoSpecifications
36*03abeaa6SGabriele Monaco--------------
37*03abeaa6SGabriele Monaco
38*03abeaa6SGabriele MonacoThe specifications included in sched are currently a work in progress, adapting the ones
39*03abeaa6SGabriele Monacodefined in by Daniel Bristot in [1].
40*03abeaa6SGabriele Monaco
41*03abeaa6SGabriele MonacoCurrently we included the following:
42*03abeaa6SGabriele Monaco
43*03abeaa6SGabriele MonacoMonitor tss
44*03abeaa6SGabriele Monaco~~~~~~~~~~~
45*03abeaa6SGabriele Monaco
46*03abeaa6SGabriele MonacoThe task switch while scheduling (tss) monitor ensures a task switch happens
47*03abeaa6SGabriele Monacoonly in scheduling context, that is inside a call to `__schedule`::
48*03abeaa6SGabriele Monaco
49*03abeaa6SGabriele Monaco                     |
50*03abeaa6SGabriele Monaco                     |
51*03abeaa6SGabriele Monaco                     v
52*03abeaa6SGabriele Monaco                   +-----------------+
53*03abeaa6SGabriele Monaco                   |     thread      | <+
54*03abeaa6SGabriele Monaco                   +-----------------+  |
55*03abeaa6SGabriele Monaco                     |                  |
56*03abeaa6SGabriele Monaco                     | schedule_entry   | schedule_exit
57*03abeaa6SGabriele Monaco                     v                  |
58*03abeaa6SGabriele Monaco    sched_switch                        |
59*03abeaa6SGabriele Monaco  +---------------                      |
60*03abeaa6SGabriele Monaco  |                       sched         |
61*03abeaa6SGabriele Monaco  +-------------->                     -+
62*03abeaa6SGabriele Monaco
63*03abeaa6SGabriele MonacoMonitor sco
64*03abeaa6SGabriele Monaco~~~~~~~~~~~
65*03abeaa6SGabriele Monaco
66*03abeaa6SGabriele MonacoThe scheduling context operations (sco) monitor ensures changes in a task state
67*03abeaa6SGabriele Monacohappen only in thread context::
68*03abeaa6SGabriele Monaco
69*03abeaa6SGabriele Monaco
70*03abeaa6SGabriele Monaco                        |
71*03abeaa6SGabriele Monaco                        |
72*03abeaa6SGabriele Monaco                        v
73*03abeaa6SGabriele Monaco    sched_set_state   +------------------+
74*03abeaa6SGabriele Monaco  +------------------ |                  |
75*03abeaa6SGabriele Monaco  |                   |  thread_context  |
76*03abeaa6SGabriele Monaco  +-----------------> |                  | <+
77*03abeaa6SGabriele Monaco                      +------------------+  |
78*03abeaa6SGabriele Monaco                        |                   |
79*03abeaa6SGabriele Monaco                        | schedule_entry    | schedule_exit
80*03abeaa6SGabriele Monaco                        v                   |
81*03abeaa6SGabriele Monaco                                            |
82*03abeaa6SGabriele Monaco                       scheduling_context  -+
83*03abeaa6SGabriele Monaco
84*03abeaa6SGabriele MonacoMonitor snroc
85*03abeaa6SGabriele Monaco~~~~~~~~~~~~~
86*03abeaa6SGabriele Monaco
87*03abeaa6SGabriele MonacoThe set non runnable on its own context (snroc) monitor ensures changes in a
88*03abeaa6SGabriele Monacotask state happens only in the respective task's context. This is a per-task
89*03abeaa6SGabriele Monacomonitor::
90*03abeaa6SGabriele Monaco
91*03abeaa6SGabriele Monaco                        |
92*03abeaa6SGabriele Monaco                        |
93*03abeaa6SGabriele Monaco                        v
94*03abeaa6SGabriele Monaco                      +------------------+
95*03abeaa6SGabriele Monaco                      |  other_context   | <+
96*03abeaa6SGabriele Monaco                      +------------------+  |
97*03abeaa6SGabriele Monaco                        |                   |
98*03abeaa6SGabriele Monaco                        | sched_switch_in   | sched_switch_out
99*03abeaa6SGabriele Monaco                        v                   |
100*03abeaa6SGabriele Monaco    sched_set_state                         |
101*03abeaa6SGabriele Monaco  +------------------                       |
102*03abeaa6SGabriele Monaco  |                       own_context       |
103*03abeaa6SGabriele Monaco  +----------------->                      -+
104*03abeaa6SGabriele Monaco
105*03abeaa6SGabriele MonacoMonitor scpd
106*03abeaa6SGabriele Monaco~~~~~~~~~~~~
107*03abeaa6SGabriele Monaco
108*03abeaa6SGabriele MonacoThe schedule called with preemption disabled (scpd) monitor ensures schedule is
109*03abeaa6SGabriele Monacocalled with preemption disabled::
110*03abeaa6SGabriele Monaco
111*03abeaa6SGabriele Monaco                       |
112*03abeaa6SGabriele Monaco                       |
113*03abeaa6SGabriele Monaco                       v
114*03abeaa6SGabriele Monaco                     +------------------+
115*03abeaa6SGabriele Monaco                     |    cant_sched    | <+
116*03abeaa6SGabriele Monaco                     +------------------+  |
117*03abeaa6SGabriele Monaco                       |                   |
118*03abeaa6SGabriele Monaco                       | preempt_disable   | preempt_enable
119*03abeaa6SGabriele Monaco                       v                   |
120*03abeaa6SGabriele Monaco    schedule_entry                         |
121*03abeaa6SGabriele Monaco    schedule_exit                          |
122*03abeaa6SGabriele Monaco  +-----------------      can_sched        |
123*03abeaa6SGabriele Monaco  |                                        |
124*03abeaa6SGabriele Monaco  +---------------->                      -+
125*03abeaa6SGabriele Monaco
126*03abeaa6SGabriele MonacoMonitor snep
127*03abeaa6SGabriele Monaco~~~~~~~~~~~~
128*03abeaa6SGabriele Monaco
129*03abeaa6SGabriele MonacoThe schedule does not enable preempt (snep) monitor ensures a schedule call
130*03abeaa6SGabriele Monacodoes not enable preemption::
131*03abeaa6SGabriele Monaco
132*03abeaa6SGabriele Monaco                        |
133*03abeaa6SGabriele Monaco                        |
134*03abeaa6SGabriele Monaco                        v
135*03abeaa6SGabriele Monaco    preempt_disable   +------------------------+
136*03abeaa6SGabriele Monaco    preempt_enable    |                        |
137*03abeaa6SGabriele Monaco  +------------------ | non_scheduling_context |
138*03abeaa6SGabriele Monaco  |                   |                        |
139*03abeaa6SGabriele Monaco  +-----------------> |                        | <+
140*03abeaa6SGabriele Monaco                      +------------------------+  |
141*03abeaa6SGabriele Monaco                        |                         |
142*03abeaa6SGabriele Monaco                        | schedule_entry          | schedule_exit
143*03abeaa6SGabriele Monaco                        v                         |
144*03abeaa6SGabriele Monaco                                                  |
145*03abeaa6SGabriele Monaco                          scheduling_contex      -+
146*03abeaa6SGabriele Monaco
147*03abeaa6SGabriele MonacoMonitor sncid
148*03abeaa6SGabriele Monaco~~~~~~~~~~~~~
149*03abeaa6SGabriele Monaco
150*03abeaa6SGabriele MonacoThe schedule not called with interrupt disabled (sncid) monitor ensures
151*03abeaa6SGabriele Monacoschedule is not called with interrupt disabled::
152*03abeaa6SGabriele Monaco
153*03abeaa6SGabriele Monaco                       |
154*03abeaa6SGabriele Monaco                       |
155*03abeaa6SGabriele Monaco                       v
156*03abeaa6SGabriele Monaco    schedule_entry   +--------------+
157*03abeaa6SGabriele Monaco    schedule_exit    |              |
158*03abeaa6SGabriele Monaco  +----------------- |  can_sched   |
159*03abeaa6SGabriele Monaco  |                  |              |
160*03abeaa6SGabriele Monaco  +----------------> |              | <+
161*03abeaa6SGabriele Monaco                     +--------------+  |
162*03abeaa6SGabriele Monaco                       |               |
163*03abeaa6SGabriele Monaco                       | irq_disable   | irq_enable
164*03abeaa6SGabriele Monaco                       v               |
165*03abeaa6SGabriele Monaco                                       |
166*03abeaa6SGabriele Monaco                        cant_sched    -+
167*03abeaa6SGabriele Monaco
168*03abeaa6SGabriele MonacoReferences
169*03abeaa6SGabriele Monaco----------
170*03abeaa6SGabriele Monaco
171*03abeaa6SGabriele Monaco[1] - https://bristot.me/linux-task-model
172