On Thu, Jun 20, 2024 at 12:15:02PM -1000, Tejun Heo wrote: > scx_next_task_picked() is used by sched_ext to notify the BPF scheduler when > a CPU is taken away by a task dispatched from a higher priority sched_class > so that the BPF scheduler can, e.g., punt the task[s] which was running or > were waiting for the CPU to other CPUs. > > Replace the sched_ext specific hook scx_next_task_picked() with a new > sched_class operation switch_class(). > > The changes are straightforward and the code looks better afterwards. > However, when !CONFIG_SCHED_CLASS_EXT, this just ends up adding an unused > hook which is unlikely to be useful to other sched_classes. We can #ifdef > the op with CONFIG_SCHED_CLASS_EXT but then I'm not sure the code > necessarily looks better afterwards. > > Please let me know the preference. If adding #ifdef's is preferable, that's > okay too. > > Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> > Suggested-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > Cc: Ingo Molnar <mingo@xxxxxxxxxx> > Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > --- > kernel/sched/core.c | 5 ++++- > kernel/sched/ext.c | 20 ++++++++++---------- > kernel/sched/ext.h | 4 ---- > kernel/sched/sched.h | 2 ++ > 4 files changed, 16 insertions(+), 15 deletions(-) > > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -5907,7 +5907,10 @@ restart: > for_each_active_class(class) { > p = class->pick_next_task(rq); > if (p) { > - scx_next_task_picked(rq, p, class); > + const struct sched_class *prev_class = prev->sched_class; > + > + if (class != prev_class && prev_class->switch_class) > + prev_class->switch_class(rq, p); > return p; > } > } I would much rather see sched_class::pick_next_task() get an extra argument so that the BPF thing can do what it needs in there and we can avoid this extra code here.