Re: [PATCH 12/36] sched_ext: Implement BPF extensible scheduler class

From: Tejun Heo
Date: Sat Mar 23 2024 - 18:12:44 EST


Hello, Joel.

On Fri, Mar 22, 2024 at 10:37:32PM -0400, Joel Fernandes wrote:
..
> I was wondering about the comment above related to 'wakeup_preempt', could
> you clarify why it is not useful (NOOP) in the sched-ext class?
>
> wakeup_preempt() may be called via:
> sched_ttwu_pending() ->
> ttwu_do_activate() ->
> wakeup_preempt()
>
>
> at which point the enqueue of the task could have already happened via:
>
> sched_ttwu_pending() ->
> ttwu_do_activate() ->
> activate_task() ->
> enqueue_task()
>
> But the comment above says "task isn't tied to the CPU" ?

In sched_ext, a scheduling queue isn't tied to a particular CPU. For
example, it's trivial to share a single global scheduling queue across the
whole system or any subset of CPUs. To support this behavior, tasks can be
hot-migrated in the dispatch path just before it starts executing:

https://github.com/sched-ext/sched_ext/blob/sched_ext/kernel/sched/ext.c#L1335

So, the CPU picked by ops.select_cpu() in the enqueue path often doesn't
determine the CPU the task is going to execute on. If the picked CPU matches
the CPU the task is eventually going to run on, there's a small performance
advantage as the later hot migration can be avoided.

As the task isn't actually tied to the CPU being picked, it's a bit awkward
to ask "does this task preempt this CPU?" Instead, preemption is implemented
by calling scx_bpf_kick_cpu() w/ SCX_KICK_PREEMPT or using the
SCX_ENQ_PREEMPT flag from the enqueue path which allows preempting any CPU.

> Apologies in advance if I missed something as I just recently starting
> looking into the sched-ext patches.

No worries. Happy to answer any questions.

Thanks.

--
tejun