Re: [PATCH 5/5] rv: Add rts monitor
From: Nam Cao <hidden>
Date: 2025-08-01 07:58:13
Also in:
lkml
On Thu, Jul 31, 2025 at 09:47:10AM +0200, Gabriele Monaco wrote:
On Wed, 2025-07-30 at 14:45 +0200, Nam Cao wrote:quoted
Add "real-time scheduling" monitor, which validates that SCHED_RR and SCHED_FIFO tasks are scheduled before tasks with normal and extensible scheduling policiesLooks a very interesting monitor! A few questions: I assume this works with rt-throttle because it implies a dequeue, right? And you probably won't see that without explicit tracepoints..
It does work properly with rt-throttling: root@yellow:~# ./rt-loop [ 74.357730] sched: RT throttling activated [ 74.357745] rv: rts: 0: violation detected Looking at rt-throlling code, it does not dequeue tasks, only does rt_rq->rt_throttled = 1; rt_rq->rt_queued = 0; so we are fine.
quoted
+ /* + * This may not be accurate, there may be enqueued RT tasks. But that's + * okay, the worst we get is a false negative. It will be accurate as + * soon as the CPU no longer has any queued RT task. + */ + ltl_atom_set(mon, LTL_RT_TASK_ENQUEUED, false);As far as I understand here the monitor would just miss RT tasks already running but would perfectly enforce the ones starting after initialisation, right?
Not exactly. What could happen is that: - RT task A already running - monitor enabled. The monitor isn't aware of task A, therefore it allows sched_switch to switch to non-RT task. - RT task B is queued. The monitor now knows at least one RT task is enqueued, so it disallows sched_switch to switch to non-RT. - RT task A is dequeued. However, the monitor does not differentiate task A and task B, therefore I thinks the only enqueued RT task is now gone. - So now we have task B started after the monitor, but the monitor does not check it. The monitor will become accurate once the CPU has no enqueued RT task, which should happen quite quickly on a sane setup where RT tasks do not monopoly the CPU. The monitor could be changed to be accurate from the get-go, by looking at how many enqueued RT tasks are present. I *think* rt_rq->rt_nr_running works. But I think the current implementation is fine, so not worth thinking too much about it.
quoted
+RULE = always (RT_TASK_ENQUEUED imply SCHEDULE_RT_NEXT) + +SCHEDULE_RT_NEXT = (not SCHED_SWITCH) until (SCHED_SWITCH_RT or EXCEPTIONS) + +EXCEPTIONS = SCHED_SWITCH_DL or not RT_TASK_ENQUEUEDThis monitor allows non-RT tasks to run indefinitely before the switch, only when it happens, RT must run, right?
Yes.
Not sure you can do much about it though. (without falling into the need resched rabbithole I was trying to untangle)
I would need to look into scheduler code, maybe we could check that the next scheduler tick implies a sched_switch. Another day. Nam