On Tue, Oct 06, 2020 at 11:08:59AM +0200, Daniel Vetter wrote:
vblank work needs to preempt commit work.
Right now we don't have any driver requiring this, but if we e.g. roll out the gamma table update for i915, then this _has_ to happen in the vblank period.
Whereas the commit work can happen in there, but it can also be delayed a bit (until the vblank worker has finished) we will not miss any additional deadline due to that.
So that's why we have 2 levels. I'm not even sure you can model that with SCHED_DEADLINE, since essentially we need a few usec of cpu time very vblank (16ms normally), but thos few usec _must_ be scheduled within a very specific time slot or we're toast. And that vblank period is only 1-2ms usually.
Depends a bit on what the hardware gets us. If for example we're provided an interrupt on vblank start, then that could wake a DEADLINE job with (given your numbers above):
.sched_period = 16ms, .sched_deadline = 1-2ms, .sched_runtime = 1-2ms,
The effective utilization of that task would be: 1-2/16.
deadline has the upshot that it compose much better than SCHED_FIFO: Everyone just drops their deadline requirements onto the scheduler, scheduler makes sure it's all obeyed (or rejects your request).
The trouble is we'd need to know how long a commit takes, worst case, on a given platform. And for that you need to measure stuff, and we kinda can't spend a few minutes at boot-up going through the combinatorial maze of atomic commits to make sure we have it all.
So I think in practice letting userspace set the right rt priority/mode is the only way to go here :-/
Or you can have it adjust it's expected runtime as the system runs (always keeping a little extra room over what you measure to make sure).
Given you have period > deadline, you can simply start with runtime = deadline and adjust downwards during use (carefully).