From: Andrea Righi <arighi@nvidia.com>
To: sashiko-reviews@lists.linux.dev
Cc: sched-ext@lists.linux.dev
Subject: Re: [PATCH 15/18] sched_ext: Delegate proxy donor admission to BPF schedulers
Date: Tue, 8 Sep 2026 12:08:24 +0200 [thread overview]
Message-ID: <ap_emBJuNQiSOFXg@gpd4> (raw)
In-Reply-To: <20260831180837.947171F000E9@smtp.kernel.org>
On Mon, Aug 31, 2026 at 06:08:37PM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [High] The new BPF scheduler receives `ops.dequeue` before `ops.enable` or `ops.enqueue` for retained proxy donors during root scheduler enablement, violating the BPF lifecycle contract.
> --
>
> commit 2446f36cb7fab90783875259131bf6b0d4fa2d3d
> Author: Andrea Righi <arighi@nvidia.com>
>
> sched_ext: Delegate proxy donor admission to BPF schedulers
>
> Proxy execution keeps a mutex-blocked donor runnable so that its
> scheduling context can execute the mutex owner. This patch introduces
> SCX_OPS_ENQ_BLOCKED to allow schedulers to continue owning blocked donors.
> A proxy-migrated donor returns through the full wakeup activation path
> when the mutex is released.
>
> > diff --git a/kernel/sched/ext/ext.c b/kernel/sched/ext/ext.c
> > index f23e9f1ee2f3c..06067fe504a24 100644
> > --- a/kernel/sched/ext/ext.c
> > +++ b/kernel/sched/ext/ext.c
>
> [ ... ]
>
> > @@ -8027,6 +8108,14 @@ static void scx_root_enable_workfn(struct kthread_work *work)
> >
> > if (old_class != new_class)
> > queue_flags |= DEQUEUE_CLASS;
> > + if (old_class == new_class && new_class == &ext_sched_class) {
> > + /*
> > + * This is an EXT-to-EXT scheduler ownership change, so
> > + * sched_change_begin() won't end retained proxy execution.
> > + */
> > + scx_prepare_task_sched_change(p);
> > + queue_flags |= DEQUEUE_NOCLOCK;
> > + }
> ^
>
> [Severity: High]
> Does this code call ops.dequeue() on the new BPF scheduler before ops.enable()
> has been called?
>
> Looking at scx_root_enable_workfn() in kernel/sched/ext/ext.c, the task's
> p->scx.sched is updated to the new scheduler in a previous loop.
>
> When scx_prepare_task_sched_change(p) is called during an EXT-to-EXT
> scheduler ownership change, it triggers the following sequence:
>
> scx_prepare_task_sched_change()
> sched_proxy_block_task()
> dequeue_task_scx()
> ops.dequeue()
>
> Because dequeue_task_scx() sees the SCX_TASK_IN_CUSTODY flag left over from
> the old scheduler, it executes ops.dequeue() on the new scheduler.
>
> Since DEQUEUE_CLASS is omitted from queue_flags for EXT-to-EXT transitions,
> the switching_to hook is skipped and scx_enable_task() is never called to
> initialize the per-task state for the new scheduler.
>
> Can this lead to the BPF program experiencing out-of-bounds map accesses or
> NULL pointer dereferences, as it relies on ops.enable() to initialize state
> before ops.dequeue() is called?
I think the described sequence can't occur during root scheduler enable:
sched_ext is globally disabled while tasks are initialized, so tasks always
enter this path from SCX_TASK_NONE without custody from previous BPF scheduler.
And I think the EXT-to-EXT scenario is unreachable. Here's why: after
__scx_enabled is set, a concurrent transition to EXT goes through
switching_to_scx(), which calls scx_enable_task() and changes the task from
SCX_TASK_READY to SCX_TASK_ENABLED. The second loop consequently skips that
task. Otherwise, a task being moved to EXT still has its old non-EXT class, so
DEQUEUE_CLASS handles the retained proxy state before switching_to_scx() enables
it.
Therefore a SCX_TASK_READY task can't legitimately reach the
old_class == new_class == &ext_sched_class case with SCX_TASK_IN_CUSTODY and
ops.dequeue() can't be called on the new scheduler before ops.enable().
So the EXT-to-EXT special case in the root-enable loop can be removed.
-Andrea
next prev parent reply other threads:[~2026-09-08 10:08 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-31 13:42 [PATCHSET v13 sched_ext/for-7.4] sched: Make proxy execution compatible with sched_ext Andrea Righi
2026-08-31 13:42 ` [PATCH 01/18] sched/core: Drop mutex locks before proxy rescheduling Andrea Righi
2026-08-31 13:42 ` [PATCH 02/18] sched/core: Dequeue waking proxy donors before reset Andrea Righi
2026-09-01 5:24 ` K Prateek Nayak
2026-09-08 9:28 ` Andrea Righi
2026-08-31 13:42 ` [PATCH 03/18] sched: Make NOHZ CFS bandwidth checks follow proxy donor Andrea Righi
2026-09-10 9:54 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 04/18] sched/core: Avoid false migration warning for proxy donors Andrea Righi
2026-09-10 10:06 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 05/18] sched: Pass next class to sched_change_begin() Andrea Righi
2026-09-10 10:12 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 06/18] sched: Add helper to block retained proxy donors Andrea Righi
2026-08-31 13:42 ` [PATCH 07/18] sched: Add sched_ext hooks for proxy execution Andrea Righi
2026-09-10 10:38 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 08/18] sched: Introduce WF_ON_RQ wake flag Andrea Righi
2026-09-10 10:45 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 09/18] sched_ext: Block proxy donors across scheduler transitions Andrea Righi
2026-09-10 10:53 ` Peter Zijlstra
2026-09-10 11:41 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 10/18] sched_ext: Fix ops.running/stopping() pairing for proxy-exec donors Andrea Righi
2026-08-31 13:42 ` [PATCH 11/18] sched_ext: Move reject DSQ draining into core Andrea Righi
2026-08-31 13:42 ` [PATCH 12/18] sched_ext: Generalize the reject DSQ reenqueue path Andrea Righi
2026-09-03 22:39 ` Tejun Heo
2026-09-08 9:34 ` Andrea Righi
2026-08-31 13:42 ` [PATCH 13/18] sched_ext: Handle proxy-exec races in remote DSQ transfers Andrea Righi
2026-08-31 13:42 ` [PATCH 14/18] sched_ext: Split curr|donor references properly Andrea Righi
2026-08-31 17:49 ` sashiko-bot
2026-09-08 10:15 ` Andrea Righi
2026-09-10 11:47 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 15/18] sched_ext: Delegate proxy donor admission to BPF schedulers Andrea Righi
2026-08-31 18:08 ` sashiko-bot
2026-09-08 10:08 ` Andrea Righi [this message]
2026-09-10 13:39 ` Peter Zijlstra
2026-09-10 13:41 ` Peter Zijlstra
2026-08-31 13:42 ` [PATCH 16/18] sched_ext: Add selftest for blocked donor admission Andrea Righi
2026-08-31 13:42 ` [PATCH 17/18] sched_ext: scx_qmap: Add proxy execution support Andrea Righi
2026-08-31 18:33 ` sashiko-bot
2026-09-01 7:52 ` Richard Cheng
2026-09-08 9:42 ` Andrea Righi
2026-08-31 13:42 ` [PATCH 18/18] sched: Allow enabling proxy exec with sched_ext Andrea Righi
2026-09-03 22:51 ` [PATCHSET v13 sched_ext/for-7.4] sched: Make proxy execution compatible " Tejun Heo
2026-09-08 8:02 ` Peter Zijlstra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ap_emBJuNQiSOFXg@gpd4 \
--to=arighi@nvidia.com \
--cc=sashiko-reviews@lists.linux.dev \
--cc=sched-ext@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.