From: Tejun Heo <tj@kernel.org>
To: Andrea Righi <arighi@nvidia.com>
Cc: David Vernet <void@manifault.com>,
Changwoo Min <changwoo@igalia.com>,
John Stultz <jstultz@google.com>, Ingo Molnar <mingo@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Juri Lelli <juri.lelli@redhat.com>,
Vincent Guittot <vincent.guittot@linaro.org>,
Dietmar Eggemann <dietmar.eggemann@arm.com>,
Steven Rostedt <rostedt@goodmis.org>,
Ben Segall <bsegall@google.com>, Mel Gorman <mgorman@suse.de>,
Valentin Schneider <vschneid@redhat.com>,
K Prateek Nayak <kprateek.nayak@amd.com>,
Christian Loehle <christian.loehle@arm.com>,
David Dai <david.dai@linux.dev>, Koba Ko <kobak@nvidia.com>,
Aiqun Yu <aiqun.yu@oss.qualcomm.com>,
Shuah Khan <shuah@kernel.org>,
Emil Tsalapatis <emil@etsalapatis.com>,
sched-ext@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 06/12] sched_ext: Fix proxy-exec race in consume_remote_task()
Date: Wed, 22 Jul 2026 13:26:03 -1000 [thread overview]
Message-ID: <1fa1975601015d95f9f5ab5cf0d95963@kernel.org> (raw)
In-Reply-To: <20260721063242.552774-7-arighi@nvidia.com>
Hello, Andrea.
On Tue, Jul 21, 2026 at 08:31:27AM +0200, Andrea Righi wrote:
> + /*
> + * Proxy execution may have changed @p's running or migration-disabled
> + * state while switching rq locks without clearing holding_cpu. This is
> + * a kernel-side race, not an invalid BPF placement request, so don't
> + * abort the scheduler on failure. Fall back to the global DSQ, where
> + * normal consumption filters can select a valid destination.
> + */
> + if (unlikely(!task_can_move_from_locked_rq(p))) {
> + p->scx.dsq = NULL;
> + p->scx.holding_cpu = -1;
> + scx_dispatch_enqueue(sch, src_rq,
> + find_global_dsq(sch, task_cpu(p)), p,
> + enq_flags | SCX_ENQ_CLEAR_OPSS |
> + SCX_ENQ_GDSQ_FALLBACK);
> + if (sched_class_above(p->sched_class,
> + src_rq->donor->sched_class))
> + resched_curr(src_rq);
> + switch_rq_lock(src_rq, this_rq);
> + return false;
> + }
I don't think bouncing the rejected task to the global DSQ is the right
thing to do. Unlike the existing GDSQ_FALLBACK cases, this fires on plain
mutex contention with proxy execution enabled, so userspace can trigger it
routinely, and the bounce bypasses the BPF scheduler's placement. It also
breaks sub-scheduler containment - when a host consumes the bypass DSQ for
its bypassing descendants, @sch is the host and a descendant's task lands on
the host's global DSQ outside its cap grants.
How about parking the rejected task on the reject DSQ and bouncing it back
through the reenqueue path so that the owning scheduler re-places it? The
two rejection reasons want different timings:
1. A migration-disabled donor can be reenqueued right away. The forced-admit
path in scx_local_or_reject_dsq() covers pinned admission and the
deferred irq_work wakes up an idle target CPU.
2. An on-CPU proxy owner should stay parked until it's switched out, or the
reenqueue can just cycle back to rejection. This needs a callout at proxy
resolution - the owner is still rq->curr when balance runs for the pick
that switches it out, so draining from balance alone isn't enough.
That'd make the scan_seq tracking, the resched_curr() and the repeated
consume attempts against an in-flight proxy section unnecessary. The reject
DSQ and scx_reenq_reject() are currently sub-sched only and would need
generalizing.
> + /*
> + * consume_remote_task() may drop @dsq->lock and requeue a
> + * rejected task onto this same DSQ. Don't reconsider tasks queued
> + * after this consume attempt started. This bounds the retry loop
> + * even when the rejected task remains on-CPU.
> + */
> + if (proxy_exec &&
> + unlikely(u32_before(scan_seq, p->scx.dsq_seq)))
> + continue;
If the requeue approach stays, the comment should mention when a task can
get bounced back - proxy execution turning it on-CPU or migration-disabled
while its context is still queued. Also, the condition fits on one line,
ditto the sched_class_above() one above.
Thanks.
--
tejun
next prev parent reply other threads:[~2026-07-22 23:36 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-21 6:31 [PATCHSET v8 sched_ext/for-7.3] sched: Make proxy execution compatible with sched_ext Andrea Righi
2026-07-21 6:31 ` [PATCH 01/12] sched/core: Avoid false migration warning for proxy donors Andrea Righi
2026-07-21 7:00 ` John Stultz
2026-07-21 7:34 ` Andrea Righi
2026-07-21 6:31 ` [PATCH 02/12] sched: Make NOHZ CFS bandwidth checks follow proxy donor Andrea Righi
2026-07-21 6:31 ` [PATCH 03/12] sched: Add helper to block retained proxy donors Andrea Righi
2026-07-21 7:02 ` John Stultz
2026-07-21 6:31 ` [PATCH 04/12] sched_ext: Block proxy donors across scheduler transitions Andrea Righi
2026-07-22 23:26 ` Tejun Heo
2026-07-21 6:31 ` [PATCH 05/12] sched_ext: Fix ops.running/stopping() pairing for proxy-exec donors Andrea Righi
2026-07-22 23:26 ` Tejun Heo
2026-07-21 6:31 ` [PATCH 06/12] sched_ext: Fix proxy-exec race in consume_remote_task() Andrea Righi
2026-07-21 7:09 ` John Stultz
2026-07-22 23:26 ` Tejun Heo [this message]
2026-07-21 6:31 ` [PATCH 07/12] sched_ext: Split curr|donor references properly Andrea Righi
2026-07-21 6:31 ` [PATCH 08/12] sched_ext: Handle blocked donor migration with proxy execution Andrea Righi
2026-07-21 6:31 ` [PATCH 09/12] sched_ext: Delegate proxy donor admission to BPF schedulers Andrea Righi
2026-07-22 23:26 ` Tejun Heo
2026-07-21 6:31 ` [PATCH 10/12] sched_ext: Add selftest for blocked donor admission Andrea Righi
2026-07-21 6:31 ` [PATCH 11/12] sched_ext: scx_qmap: Add proxy execution support Andrea Righi
2026-07-21 6:31 ` [PATCH 12/12] sched: Allow enabling proxy exec with sched_ext Andrea Righi
2026-07-21 7:05 ` John Stultz
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=1fa1975601015d95f9f5ab5cf0d95963@kernel.org \
--to=tj@kernel.org \
--cc=aiqun.yu@oss.qualcomm.com \
--cc=arighi@nvidia.com \
--cc=bsegall@google.com \
--cc=changwoo@igalia.com \
--cc=christian.loehle@arm.com \
--cc=david.dai@linux.dev \
--cc=dietmar.eggemann@arm.com \
--cc=emil@etsalapatis.com \
--cc=jstultz@google.com \
--cc=juri.lelli@redhat.com \
--cc=kobak@nvidia.com \
--cc=kprateek.nayak@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sched-ext@lists.linux.dev \
--cc=shuah@kernel.org \
--cc=vincent.guittot@linaro.org \
--cc=void@manifault.com \
--cc=vschneid@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox