[PATCH 06/14] sched_ext: Block proxy donors across scheduler transitions

Andrea Righi <[email protected]> Sat, 25 Jul 2026 18:04:12 +0200
Newsgroups dev.linux.lists.sched-ext,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Proxy execution retains mutex-blocked donors on the runqueue so their
scheduling context can execute a lock owner. sched_ext cannot safely
retain such donors unless the BPF scheduler explicitly participates in
their admission and ordering.

Make sched_ext reject retained donors by default. Implement
scx_allow_proxy_exec() to force blocked EXT tasks through the regular
block path in schedule(), and fully deactivate a retained donor before
sched_setscheduler(), PI de-boosting, or global activation moves it into
the EXT class.

This is a preparatory change to support proxy execution with sched_ext.

Acked-by: John Stultz <[email protected]>
Signed-off-by: Andrea Righi <[email protected]>
---
 kernel/sched/ext/ext.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/kernel/sched/ext/ext.c b/kernel/sched/ext/ext.c
index c7a77cc914cd5..bd9a8c3a269af 100644
--- a/kernel/sched/ext/ext.c
+++ b/kernel/sched/ext/ext.c
@@ -26,7 +26,15 @@ DEFINE_RAW_SPINLOCK(scx_sched_lock);
 
 bool scx_allow_proxy_exec(const struct task_struct *p)
 {
-	return true;
+	return p->sched_class != &ext_sched_class;
+}
+
+static void prepare_switch_scx(struct rq *rq, struct task_struct *p)
+{
+	lockdep_assert_held(&p->pi_lock);
+	lockdep_assert_rq_held(rq);
+
+	sched_proxy_block_task(task_rq(p), p);
 }
 
 /*
@@ -4731,6 +4739,7 @@ DEFINE_SCHED_CLASS(ext) = {
 
 	.task_tick		= task_tick_scx,
 
+	.prepare_switch		= prepare_switch_scx,
 	.switching_to		= switching_to_scx,
 	.switched_from		= switched_from_scx,
 	.switched_to		= switched_to_scx,
-- 
2.55.0