mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: K Prateek Nayak <kprateek.nayak@amd.com>
To: Ingo Molnar <mingo@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Vincent Guittot <vincent.guittot@linaro.org>,
	John Stultz <jstultz@google.com>, <linux-kernel@vger.kernel.org>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Valentin Schneider <vschneid@redhat.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Ben Segall <bsegall@google.com>,
	Joel Fernandes <joelagnelf@nvidia.com>,
	Qais Yousef <qyousef@layalina.io>,
	Zimuzo Ezeozue <zezeozue@google.com>,
	Will Deacon <will@kernel.org>, Waiman Long <longman@redhat.com>,
	Boqun Feng <boqun.feng@gmail.com>,
	"Paul E. McKenney" <paulmck@kernel.org>,
	Metin Kaya <Metin.Kaya@arm.com>,
	Xuewen Yan <xuewen.yan94@gmail.com>,
	K Prateek Nayak <kprateek.nayak@amd.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	"Daniel Lezcano" <daniel.lezcano@linaro.org>,
	Suleiman Souhlal <suleiman@google.com>,
	kuyo chang <kuyo.chang@mediatek.com>, hupu <hupu.gm@gmail.com>,
	Vasily Gorbik <gor@linux.ibm.com>, <kernel-team@android.com>
Subject: [RFC PATCH 2/3] sched/core: Fix forceidle when lock owner has mismatchd cookie
Date: Fri, 17 Jul 2026 11:16:00 +0000	[thread overview]
Message-ID: <20260717111601.6017-3-kprateek.nayak@amd.com> (raw)
In-Reply-To: <20260717111601.6017-1-kprateek.nayak@amd.com>

Move Vasily's fix from 7cd4088f70e0 ("sched/core: Don't proxy-exec
unmatched cookie lock owners") into a separate helper and fix the
forceidle stats, balance callback queuing when rq is not the one
dictating the core cookie.

The helper will be extended in subsequent commits to allow for re-pick
with cookie from the lock owner if rq is the pick leader.

Signed-off-by: K Prateek Nayak <kprateek.nayak@amd.com>
---
 kernel/sched/core.c | 43 ++++++++++++++++++++++++++++++++++++-------
 1 file changed, 36 insertions(+), 7 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 31fa6bcee616..ed11410f1416 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6598,6 +6598,8 @@ __pick_next_task(struct rq *rq, struct rq_flags *rf)
 	BUG(); /* The idle class should always have a runnable task. */
 }
 
+static void proxy_deactivate(struct rq *rq, struct task_struct *donor);
+
 #ifdef CONFIG_SCHED_CORE
 static inline bool is_task_rq_idle(struct task_struct *t)
 {
@@ -7100,6 +7102,23 @@ static inline void sched_core_cpu_dying(unsigned int cpu)
 		rq->core = rq;
 }
 
+static struct task_struct *
+sched_core_swap_pick(struct rq *rq, struct task_struct *next)
+{
+	if (!rq->core_pick_leader) {
+		if (!rq->core->core_forceidle_count++)
+			rq->core->core_forceidle_seq++;
+
+		proxy_resched_idle(rq);
+		queue_core_balance(rq);
+		return rq->idle;
+	}
+
+	clear_task_blocked_on(rq->donor, NULL);
+	proxy_deactivate(rq, rq->donor);
+	return RETRY_TASK;
+}
+
 #else /* !CONFIG_SCHED_CORE: */
 
 static inline void sched_core_cpu_starting(unsigned int cpu) {}
@@ -7113,6 +7132,18 @@ pick_next_task(struct rq *rq, struct rq_flags *rf)
 	return __pick_next_task(rq, rf);
 }
 
+static struct task_struct *
+sched_core_swap_pick(struct rq *rq, struct task_struct *next)
+{
+	/*
+	 * Caller should always check !sched_cpu_cookie_match(rq, next)
+	 * which is always false for !CONFIG_SCHED_CORE and execution
+	 * should never reach here.
+	 */
+	BUG_ON();
+	return next;
+}
+
 #endif /* !CONFIG_SCHED_CORE */
 
 /*
@@ -7512,13 +7543,6 @@ find_proxy_task(struct rq *rq, struct task_struct *donor, struct rq_flags *rf)
 	}
 	WARN_ON_ONCE(owner && !owner->on_rq);
 
-	if (owner && !sched_cpu_cookie_match(rq, owner)) {
-		if (curr_in_chain)
-			return proxy_resched_idle(rq);
-		p = donor; /* Deactivate the donor, not the runnable owner */
-		clear_task_blocked_on(p, NULL);
-		goto deactivate;
-	}
 	return owner;
 
 deactivate:
@@ -7686,6 +7710,11 @@ static void __sched notrace __schedule(int sched_mode)
 				zap_balance_callbacks(rq);
 				goto keep_resched;
 			}
+			if (!sched_cpu_cookie_match(rq, next)) {
+				next = sched_core_swap_pick(rq, next);
+				if (next == RETRY_TASK)
+					goto pick_again;
+			}
 			trace_sched_found_proxy_task(rq->donor, next, cpu);
 		}
 		if (rq->donor == prev_donor && prev != next) {
-- 
2.43.0


  parent reply	other threads:[~2026-07-17 11:17 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-01 21:45 [PATCH v30 0/7] Sleeping Owner Handling for Proxy Execution (v30) John Stultz
2026-07-01 21:45 ` [PATCH v30 1/7] sched/core: Don't steal a proxy-exec donor John Stultz
2026-07-01 21:45 ` [PATCH v30 2/7] sched/core: Avoid migrating blocked_on tasks John Stultz
2026-07-01 21:45 ` [PATCH v30 3/7] sched/core: Don't proxy-exec unmatched cookie lock owners John Stultz
2026-07-02  5:13   ` K Prateek Nayak
2026-07-02  9:14     ` Peter Zijlstra
2026-07-08  5:00     ` John Stultz
2026-07-10  3:13       ` K Prateek Nayak
2026-07-10  3:32         ` John Stultz
2026-07-17 11:15           ` [RFC PATCH 0/3] sched/core: Allow proxy execution to work with core scheduling K Prateek Nayak
2026-07-17 11:15             ` [RFC PATCH 1/3] sched/core: Track the core-wide pick leader K Prateek Nayak
2026-07-17 11:16             ` K Prateek Nayak [this message]
2026-07-23  3:14               ` [RFC PATCH 2/3] sched/core: Fix forceidle when lock owner has mismatchd cookie John Stultz
2026-07-23  4:01                 ` K Prateek Nayak
2026-07-17 11:16             ` [RFC PATCH 3/3] sched/core: Swap to lock owner for core-wide pick on core-cookie mismatch K Prateek Nayak
2026-07-18  6:22               ` K Prateek Nayak
2026-07-18  7:01             ` [RFC PATCH 0/3] sched/core: Allow proxy execution to work with core scheduling John Stultz
2026-07-01 21:45 ` [PATCH v30 4/7] sched: Switch rq->next_class in proxy_reset_donor() John Stultz
2026-07-01 21:46 ` [PATCH v30 5/7] sched: Break out core of attach_tasks() helper into sched.h John Stultz
2026-07-01 21:46 ` [PATCH v30 6/7] sched: Migrate whole chain in proxy_migrate_task() John Stultz
2026-07-01 21:46 ` [PATCH v30 7/7] sched: Add deactivated (sleeping) owner handling to find_proxy_task() John Stultz
2026-07-03  3:06   ` K Prateek Nayak
2026-07-08  4:34     ` John Stultz
2026-07-10  4:03       ` K Prateek Nayak
2026-07-10  4:56         ` 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=20260717111601.6017-3-kprateek.nayak@amd.com \
    --to=kprateek.nayak@amd.com \
    --cc=Metin.Kaya@arm.com \
    --cc=boqun.feng@gmail.com \
    --cc=bsegall@google.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=dietmar.eggemann@arm.com \
    --cc=gor@linux.ibm.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=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=suleiman@google.com \
    --cc=tglx@linutronix.de \
    --cc=vincent.guittot@linaro.org \
    --cc=vschneid@redhat.com \
    --cc=will@kernel.org \
    --cc=xuewen.yan94@gmail.com \
    --cc=zezeozue@google.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®