From: Andrea Righi <arighi@nvidia.com>
To: Tejun Heo <tj@kernel.org>
Cc: David Vernet <void@manifault.com>,
Changwoo Min <changwoo@igalia.com>,
sched-ext@lists.linux.dev, Emil Tsalapatis <emil@etsalapatis.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 sched_ext/for-7.3 28/33] sched_ext: Route ops.update_idle() to sub-schedulers and re-notify owed scheds
Date: Tue, 14 Jul 2026 08:18:20 +0200 [thread overview]
Message-ID: <alXUrLY3WMdAyXIc@gpd4> (raw)
In-Reply-To: <20260709225041.1695495-29-tj@kernel.org>
Hi Tejun,
On Thu, Jul 09, 2026 at 12:50:36PM -1000, Tejun Heo wrote:
> __scx_update_idle() notified only the root scheduler. A sub-scheduler that
> holds a cid needs that cid's idle state to place and kick on it.
>
> Deliver ops.update_idle() to every scheduler that holds SCX_CAP_BASE on the
> transitioning cid. The root holds every cap, so a real transition always
> reaches it.
>
> Real transitions are not enough on their own. A cid that is already idle
> when a sub-sched gains baseline access produces no transition, so the new
> holder would never learn it is idle. The ecaps sync arms a re-notify on the
> gain, and the next idle pick delivers ops.update_idle() to just that sched,
> leaving holders that already track the cpu untouched. A matching loss of
> baseline access drops any pending re-notify.
>
> Bypass suppresses ops.update_idle() too, so a cpu that goes idle during a
> bypass window and stays idle yields no transition to re-deliver on
> un-bypass. Arm the same re-notify for every sched leaving bypass. The acute
> case is a child granted cids during its own ops.sub_attach(). The grant
> lands while the child is bypassed and the notify walk skips it, so on
> un-bypass it holds cids it never saw go idle. The root is owed the same and
> is armed through a separate per-rq flag, which keeps this working when
> sub-schedulers are compiled out.
>
> v2: Gate the idle catch-up in pick_task_idle() to avoid a double ops.update_idle(). (sashiko AI)
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> ---
...
> +/*
> + * Notify schedulers of an idle transition on @cpu's cid, delivering to every
> + * sched that holds %SCX_CAP_BASE on the cid (the root holds every cap). A real
> + * transition (@do_notify) reaches all holders. A forced one (@root_renotify for
> + * the root, a sub-sched's idle_renotify marker for a sub) reaches only the owed
> + * scheds.
> + */
> +static void scx_idle_notify(struct rq *rq, bool idle, bool do_notify, bool root_renotify)
> +{
> + s32 cpu = cpu_of(rq);
> + s32 cid = scx_cpu_arg(cpu);
> + struct scx_sched *pos;
> +
> + lockdep_assert_rq_held(rq);
> +
> + pos = scx_next_descendant_pre(NULL, scx_root);
> + while (pos) {
> + bool forced = false;
> +
> + if (unlikely(scx_missing_caps(pos, cpu, SCX_CAP_BASE))) {
> + pos = scx_skip_subtree_pre(pos, scx_root);
> + continue;
> + }
> +
> + if (pos == scx_root) {
> + forced = root_renotify;
> + }
> +#ifdef CONFIG_EXT_SUB_SCHED
> + else if (per_cpu_ptr(pos->pcpu, cpu)->idle_renotify) {
> + per_cpu_ptr(pos->pcpu, cpu)->idle_renotify = false;
> + forced = true;
> + }
> +#endif
> + if ((do_notify || forced) && SCX_HAS_OP(pos, update_idle) &&
> + !scx_bypassing(pos, cpu))
> + SCX_CALL_OP(pos, update_idle, rq, cid, idle);
> + pos = scx_next_descendant_pre(pos, scx_root);
> + }
> +}
So, this makes every real idle/busy transition walk the whole scheduler
hierarchy and potentially invoke ops.update_idle() for every cap-holding
scheduler while the rq lock is held and IRQs are disabled?
This becomes O(number of cap-holding schedulers) BPF callbacks per idle
transition.
I haven't benchmarked this, so I'm not sure if it's a valid performance concern.
We don't have to fix this now, it can be a future improvement. In that case, if
we prove that we have a real bottleneck here, would it make sense to maintain a
per-rq list of schedulers that both hold effective SCX_CAP_BASE and implement
ops.update_idle()?
Also, for the root-only case, would it be worth keeping the old direct
ops.update_idle() path behind a static key which is enabled while any
sub-scheduler is attached?
Thanks,
-Andrea
next prev parent reply other threads:[~2026-07-14 6:18 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-09 22:50 [PATCHSET v5 sched_ext/for-7.3] sched_ext: Capability-based CPU delegation for sub-schedulers Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 01/33] sched_ext: Assert per-task ops run on the task's owner Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 02/33] sched_ext: Make the kick machinery per-sched Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 03/33] sched_ext: Add ops.init_cids() to finalize the cid layout before init Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 04/33] sched_ext: Add CID sharding Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 05/33] sched_ext: Add shard boundaries to scx_bpf_cid_override() Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 06/33] sched_ext: Defer scx_sched kobj sysfs add into the enable workfns Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 07/33] sched_ext: Add per-shard scx_sched storage scaffolding Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 08/33] sched_ext: Add scx_cmask_ref for validated arena cmask access Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 09/33] sched_ext: Build the set_cmask scratch from trusted geometry Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 10/33] sched_ext: RCU-protect the sub-sched tree's children/sibling lists Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 11/33] sched_ext: Add scx_skip_subtree_pre() Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 12/33] sched_ext: Stop resolving a disabled scheduler's programs Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 13/33] sched_ext: Add per-shard cap delegation for sub-schedulers Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 14/33] sched_ext: Add coalescing sub_caps_updated() notifier " Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 15/33] sched_ext: Maintain per-cpu effective cap copies for single-read checks Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 16/33] sched_ext: Add sub_ecaps_updated() effective-cap change notifier Tejun Heo
2026-07-14 6:00 ` Andrea Righi
2026-07-14 8:07 ` Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 17/33] sched_ext: Generalize local-DSQ handling to rq-owned DSQs Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 18/33] sched_ext: Add reject DSQ for cap-rejected dispatches Tejun Heo
2026-07-14 6:49 ` Andrea Righi
2026-07-14 8:08 ` Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 19/33] sched_ext: Add SCX_ENQ_IGNORE_CAPS for in-place restore Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 20/33] sched_ext: Add the SCX_CAP_ENQ_IMMED cap Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 21/33] sched_ext: Assign a unique id to each scheduler instance Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 22/33] sched_ext: Route task slice writes through set_task_slice() Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 23/33] sched_ext: Track the cpu a task is runnable on Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 24/33] sched_ext: Tie cpu occupancy to SCX_CAP_BASE through the task slice Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 25/33] sched_ext: Add the SCX_CAP_ENQ cap Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 26/33] sched_ext: Gate kicks on SCX_CAP_BASE and preemption on SCX_CAP_PREEMPT Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 27/33] sched_ext: Authorize remote-move inserts against the placing scheduler Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 28/33] sched_ext: Route ops.update_idle() to sub-schedulers and re-notify owed scheds Tejun Heo
2026-07-14 6:18 ` Andrea Righi [this message]
2026-07-14 8:08 ` Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 29/33] sched_ext: Replay ecaps notifications suppressed by bypass Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 30/33] sched_ext: Add scx_bpf_sub_kill() to evict a child sub-scheduler Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 31/33] tools/sched_ext: Add three-mask cmask intersection iterator Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 32/33] tools/sched_ext: scx_qmap - Expand hierarchical sub-scheduling Tejun Heo
2026-07-09 22:50 ` [PATCH v5 sched_ext/for-7.3 33/33] tools/sched_ext: scx_qmap - Add sub-sched cap fault injection Tejun Heo
2026-07-14 7:10 ` [PATCHSET v5 sched_ext/for-7.3] sched_ext: Capability-based CPU delegation for sub-schedulers Andrea Righi
2026-07-14 8:07 ` Tejun Heo
2026-07-14 8:27 ` Tejun Heo
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=alXUrLY3WMdAyXIc@gpd4 \
--to=arighi@nvidia.com \
--cc=changwoo@igalia.com \
--cc=emil@etsalapatis.com \
--cc=linux-kernel@vger.kernel.org \
--cc=sched-ext@lists.linux.dev \
--cc=tj@kernel.org \
--cc=void@manifault.com \
/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.