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