From: Kayra Cizmeci <kayracizmeci@gmail.com>
To: John Stultz <jstultz@google.com>
Cc: LKML <linux-kernel@vger.kernel.org>, Hui Su <sh_def@163.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
K Prateek Nayak <kprateek.nayak@amd.com>,
Thomas Gleixner <tglx@linutronix.de>,
Juri Lelli <juri.lelli@redhat.com>,
Vincent Guittot <vincent.guittot@linaro.org>,
Valentin Schneider <vschneid@redhat.com>,
Suleiman Souhlal <suleiman@google.com>,
Andrea Righi <arighi@nvidia.com>,
Metin Kaya <Metin.Kaya@arm.com>,
Dietmar Eggemann <dietmar.eggemann@arm.com>,
Steven Rostedt <rostedt@goodmis.org>,
Zimuzo Ezeozue <zezeozue@google.com>,
Waiman Long <longman@redhat.com>,
Boqun Feng <boqun.feng@gmail.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
Joel Fernandes <joelagnelf@nvidia.com>,
Qais Yousef <qyousef@layalina.io>,
Xuewen Yan <xuewen.yan94@gmail.com>,
kuyo chang <kuyo.chang@mediatek.com>, hupu <hupu.gm@gmail.com>,
Zhan Xusheng <zhanxusheng@xiaomi.com>,
"zhidao su (Xiaomi)" <soolaugust@gmail.com>,
"Shubhang Kaushik (Ampere)" <sh@gentwo.org>,
kernel-team@android.com
Subject: Re: [PATCH v33 6/7] sched/proxy: Detect cycles in proxy walks earlier
Date: Sat, 24 Oct 2026 18:34:07 +0300 [thread overview]
Message-ID: <aty_3dSObMLU4AET@scheduler.schedules> (raw)
In-Reply-To: <20261023220431.1106611-7-jstultz@google.com>
On Fri, Oct 23, 2026 at 10:04:17PM +0000, John Stultz wrote:
> From: Hui Su <sh_def@163.com>
>
> Proxy execution follows blocked_on relationships to find a runnable lock
> owner. A cycle in that chain can make find_proxy_task() loop indefinitely
> while holding rq->lock.
>
> Use Brent checkpoint state directly in the real owner walk. Cycle detection
> reuses the owner resolution already performed by that walk and requires no
> separate preflight traversal. The checkpoint, power, and span state are all
> invocation-local.
>
> Keep the existing owner == p wakeup-race handling ahead of cycle detection.
> Unlike a sequence-marker approach, this adds no task_struct or runqueue
> state and requires no activation-time reset.
>
> The online walk can temporarily install a blocked_donor cycle before the
> delayed Brent detection point. In the tested recovery path, the selected
> task's blocked_donor was cleared before it resumed. A forced-stale control
> also confirmed that mutex handoff revalidates the donor's blocked_on
> relationship before consuming a backlink. Validation of this trade-off and
> comparative measurements against the sequence-marker approach are included
> in the cover letter.
Wouldn't it be better to add the results here or remove this sentence
completely? "Validation of this trade-off and comparative measurements against
the sequence-marker approach are included in the cover letter."
>
> Signed-off-by: Hui Su <sh_def@163.com>
> [jstultz: Minor tweaks to work with hard MAX_PROXY_CHAIN_DEPTH limit]
> Signed-off-by: John Stultz <jstultz@google.com>
> ---
> ---
> kernel/sched/core.c | 22 +++++++++++++++++++---
> 1 file changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 12a42252bf474..0cb41a884ea70 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -7017,6 +7017,9 @@ find_proxy_task(struct rq *rq, struct task_struct *donor, struct rq_flags *rf)
> __must_hold(__rq_lockp(rq))
> {
> struct task_struct *owner = NULL;
> + struct task_struct *cycle_checkpoint = donor;
> + unsigned int cycle_power = 1;
> + unsigned int cycle_span = 0;
> bool curr_in_chain = false;
> int this_cpu = cpu_of(rq);
> struct task_struct *p;
> @@ -7025,8 +7028,16 @@ find_proxy_task(struct rq *rq, struct task_struct *donor, struct rq_flags *rf)
>
> /* Follow blocked_on chain. */
> for (p = donor; p->is_blocked; p = owner) {
> - /* if its PROXY_WAKING, do return migration or run if current */
> struct mutex *mutex = p->blocked_on;
> +
> + /* Keep Brent's checkpoint state local to this owner walk. */
I think we don't need the comment above, no? Or atleast maybe changing it would
be better to tell what the algorithm does.
> + if (cycle_span == cycle_power) {
> + cycle_checkpoint = p;
> + cycle_power <<= 1;
> + cycle_span = 0;
> + }
> +
> + /* if its PROXY_WAKING, do return migration or run if current */
> if (!mutex) {
> clear_task_blocked_on(p, mutex);
> if (task_current(rq, p) || p->wake_cpu == task_cpu(p)) {
> @@ -7143,8 +7154,13 @@ find_proxy_task(struct rq *rq, struct task_struct *donor, struct rq_flags *rf)
> goto resched_idle;
> }
>
> - /* Limit the depth we'll proxy to avoid cyclic deadlocks */
> - if (++chain_depth > MAX_PROXY_CHAIN_DEPTH) {
> + /*
> + * Check for cycles, and worst case limit the depth
> + * we'll proxy to avoid cyclic deadlocks
> + */
> + cycle_span++;
> + if ((owner == cycle_checkpoint) ||
> + (++chain_depth > MAX_PROXY_CHAIN_DEPTH)) {
> __clear_task_blocked_on(p, NULL);
> goto deactivate;
> }
> --
> 2.56.0.257.gf7497c7d27-goog
>
So on a loop like this (Circle but a square):
TA->X
| |
Y<-TB
Where TA holds X, wants Y and TB wants X, holds Y. And the donor is TA.
At the first run, we get the mutex of TA and then find it's owner (that
is TB), and we increase cycle_span by one. The next run is with TB, now
power is 2, and span is 0. Owner is TA, so again owner ==
cycle_checkpoint is false. span is 1 now. The next run, owner is TB,
and now we leave.
AFAICT this works correct.
Reviewed-by: Kayra Cizmeci <kayracizmeci@gmail.com>
next prev parent reply other threads:[~2026-10-24 15:34 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-23 22:04 [PATCH v33 0/7] Sleeping Owner Handling for Proxy Execution (v33) John Stultz
2026-10-23 22:04 ` [PATCH v33 1/7] sched/psi: Preserve sleep-persistent PSI flags on off-CPU sleeping dequeues John Stultz
2026-10-24 11:44 ` Peter Zijlstra
2026-10-23 22:04 ` [PATCH v33 2/7] sched/core: Use the scheduling context for remote ticks John Stultz
2026-10-24 13:44 ` Kayra Cizmeci
2026-10-23 22:04 ` [PATCH v33 3/7] sched/core: Activate blocked donor when no owner is found John Stultz
2026-10-24 8:33 ` Andrea Righi
2026-10-23 22:04 ` [PATCH v33 4/7] sched/proxy: Set TASK_RUNNING when shortcuting return migration John Stultz
2026-10-24 8:36 ` Andrea Righi
2026-10-23 22:04 ` [PATCH v33 5/7] sched/proxy: Break cyclic proxy chains by deactivating blocked tasks John Stultz
2026-10-23 22:04 ` [PATCH v33 6/7] sched/proxy: Detect cycles in proxy walks earlier John Stultz
2026-10-24 15:34 ` Kayra Cizmeci [this message]
2026-10-23 22:04 ` [PATCH v33 7/7] sched/proxy: Add deactivated (sleeping) owner handling to find_proxy_task() John Stultz
2026-10-24 9:07 ` Andrea Righi
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=aty_3dSObMLU4AET@scheduler.schedules \
--to=kayracizmeci@gmail.com \
--cc=Metin.Kaya@arm.com \
--cc=arighi@nvidia.com \
--cc=boqun.feng@gmail.com \
--cc=dietmar.eggemann@arm.com \
--cc=hupu.gm@gmail.com \
--cc=joelagnelf@nvidia.com \
--cc=jstultz@google.com \
--cc=juri.lelli@redhat.com \
--cc=kernel-team@android.com \
--cc=kprateek.nayak@amd.com \
--cc=kuyo.chang@mediatek.com \
--cc=linux-kernel@vger.kernel.org \
--cc=longman@redhat.com \
--cc=mingo@redhat.com \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=qyousef@layalina.io \
--cc=rostedt@goodmis.org \
--cc=sh@gentwo.org \
--cc=sh_def@163.com \
--cc=soolaugust@gmail.com \
--cc=suleiman@google.com \
--cc=tglx@linutronix.de \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
--cc=xuewen.yan94@gmail.com \
--cc=zezeozue@google.com \
--cc=zhanxusheng@xiaomi.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
all inboxes | Powered by JetHome®