Re: [PATCH 2/3] sched_ext: Factor out reenq_local() from scx_bpf_reenqueue_local()

From: Emil Tsalapatis
Date: Sat Oct 25 2025 - 19:19:23 EST


On Fri, Oct 24, 2025 at 8:18 PM Tejun Heo <tj@xxxxxxxxxx> wrote:
>
> Factor out the core re-enqueue logic from scx_bpf_reenqueue_local() into a
> new reenq_local() helper function. scx_bpf_reenqueue_local() now handles the
> BPF kfunc checks and calls reenq_local() to perform the actual work.
>
> This is a prep patch to allow reenq_local() to be called from other contexts.
>
> Signed-off-by: Tejun Heo <tj@xxxxxxxxxx>
> ---

Reviewed-by: Emil Tsalapatis <emil@xxxxxxxxxxxxxxx>

> kernel/sched/ext.c | 50 +++++++++++++++++++++++++++++---------------------
> 1 file changed, 29 insertions(+), 21 deletions(-)
>
> diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
> index 111111111111..222222222222 100644
> --- a/kernel/sched/ext.c
> +++ b/kernel/sched/ext.c
> @@ -5881,32 +5881,12 @@ static const struct btf_kfunc_id_set scx_kfunc_set_dispatch = {
> .set = &scx_kfunc_ids_dispatch,
> };
>
> -__bpf_kfunc_start_defs();
> -
> -/**
> - * scx_bpf_reenqueue_local - Re-enqueue tasks on a local DSQ
> - *
> - * Iterate over all of the tasks currently enqueued on the local DSQ of the
> - * caller's CPU, and re-enqueue them in the BPF scheduler. Returns the number of
> - * processed tasks. Can only be called from ops.cpu_release().
> - */
> -__bpf_kfunc u32 scx_bpf_reenqueue_local(void)
> +static u32 reenq_local(struct rq *rq)
> {
> - struct scx_sched *sch;
> LIST_HEAD(tasks);
> u32 nr_enqueued = 0;
> - struct rq *rq;
> struct task_struct *p, *n;
>
> - guard(rcu)();
> - sch = rcu_dereference(scx_root);
> - if (unlikely(!sch))
> - return 0;
> -
> - if (!scx_kf_allowed(sch, SCX_KF_CPU_RELEASE))
> - return 0;
> -
> - rq = cpu_rq(smp_processor_id());
> lockdep_assert_rq_held(rq);
>
> /*
> @@ -5943,6 +5923,34 @@ __bpf_kfunc u32 scx_bpf_reenqueue_local(void)
> return nr_enqueued;
> }
>
> +__bpf_kfunc_start_defs();
> +
> +/**
> + * scx_bpf_reenqueue_local - Re-enqueue tasks on a local DSQ
> + *
> + * Iterate over all of the tasks currently enqueued on the local DSQ of the
> + * caller's CPU, and re-enqueue them in the BPF scheduler. Returns the number of
> + * processed tasks. Can only be called from ops.cpu_release().
> + */
> +__bpf_kfunc u32 scx_bpf_reenqueue_local(void)
> +{
> + struct scx_sched *sch;
> + struct rq *rq;
> +
> + guard(rcu)();
> + sch = rcu_dereference(scx_root);
> + if (unlikely(!sch))
> + return 0;
> +
> + if (!scx_kf_allowed(sch, SCX_KF_CPU_RELEASE))
> + return 0;
> +
> + rq = cpu_rq(smp_processor_id());
> + lockdep_assert_rq_held(rq);
> +
> + return reenq_local(rq);
> +}
> +
> __bpf_kfunc_end_defs();
>
> BTF_KFUNCS_START(scx_kfunc_ids_cpu_release)
> --
> 2.47.1
>