Skip to content

Commit

Permalink
sched_ext: Implement sched_ext_ops.cpu_online/offline()
Browse files Browse the repository at this point in the history
Add ops.cpu_online/offline() which are invoked when CPUs come online and
offline respectively. As the enqueue path already automatically bypasses
tasks to the local dsq on a deactivated CPU, BPF schedulers are guaranteed
to see tasks only on CPUs which are between online() and offline().

Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: David Vernet <dvernet@meta.com>
Acked-by: Josh Don <joshdon@google.com>
Acked-by: Hao Luo <haoluo@google.com>
Acked-by: Barret Rhoden <brho@google.com>
  • Loading branch information
htejun authored and intel-lab-lkp committed Jan 28, 2023
1 parent 68c08f6 commit 7a3d3e9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
18 changes: 18 additions & 0 deletions include/linux/sched/ext.h
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,24 @@ struct sched_ext_ops {
*/
void (*cpu_release)(s32 cpu, struct scx_cpu_release_args *args);

/**
* cpu_online - A CPU became online
* @cpu: CPU which just came up
*
* @cpu just came online. @cpu doesn't call ops.enqueue() or run tasks
* associated with other CPUs beforehand.
*/
void (*cpu_online)(s32 cpu);

/**
* cpu_offline - A CPU is going offline
* @cpu: CPU which is going offline
*
* @cpu is going offline. @cpu doesn't call ops.enqueue() or run tasks
* associated with other CPUs afterwards.
*/
void (*cpu_offline)(s32 cpu);

/**
* prep_enable - Prepare to enable BPF scheduling for a task
* @p: task to prepare BPF scheduling for
Expand Down
15 changes: 15 additions & 0 deletions kernel/sched/ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -1727,6 +1727,18 @@ void __scx_update_idle(struct rq *rq, bool idle)
}
}

static void rq_online_scx(struct rq *rq, enum rq_onoff_reason reason)
{
if (SCX_HAS_OP(cpu_online) && reason == RQ_ONOFF_HOTPLUG)
scx_ops.cpu_online(cpu_of(rq));
}

static void rq_offline_scx(struct rq *rq, enum rq_onoff_reason reason)
{
if (SCX_HAS_OP(cpu_offline) && reason == RQ_ONOFF_HOTPLUG)
scx_ops.cpu_offline(cpu_of(rq));
}

#else /* !CONFIG_SMP */

static bool test_and_clear_cpu_idle(int cpu) { return false; }
Expand Down Expand Up @@ -2215,6 +2227,9 @@ DEFINE_SCHED_CLASS(ext) = {
.balance = balance_scx,
.select_task_rq = select_task_rq_scx,
.set_cpus_allowed = set_cpus_allowed_scx,

.rq_online = rq_online_scx,
.rq_offline = rq_offline_scx,
#endif

.task_tick = task_tick_scx,
Expand Down

0 comments on commit 7a3d3e9

Please sign in to comment.