[PATCH] sched/deadline: Ignore proxy-exec sched_yield()

From: Christian Loehle

Date: Tue Jul 07 2026 - 13:49:23 EST


With proxy execution, rq->curr is the execution context while rq->donor is
the donating context. rq->curr's sched_yield() is dispatched through
the donor class so that proxy execution follows the effective scheduling
context.

For SCHED_DEADLINE, this is too strong. yield_task_dl() does not just ask
for another task of equal priority to get to run, it marks the current DL
entity as yielded and forces it to sleep until replenishment. These
yield semantics are fundamentally different from FIFO/RR (where if no
equal-priority tasks are runnable, no harm done, they get picked again
immediately) or OTHER (also doesn't cause priority inversion), so do not
mix these semantics by ignoring a sched_yield() on DL donors.

Fixes: 127b90315ca0 ("sched/proxy: Yield the donor task")
Signed-off-by: Christian Loehle <christian.loehle@xxxxxxx>
---
I have just looked through the old discussion and noticed that the
argument for always doing donor yielding doesn't hold for DL and ignoring
it should be the safer and saner handling. Haven't actually encountered
the issue.
old discussion:
https://lore.kernel.org/oe-lkp/202510211205.1e0f5223-lkp@xxxxxxxxx/T/#m0ea38261f80fc06018ca140eb0d115b11299cfc1
https://lore.kernel.org/lkml/20251106104022.195157-1-sieberf@xxxxxxxxxx/

kernel/sched/deadline.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
index a3003b0f4522..13c5c3f0a081 100644
--- a/kernel/sched/deadline.c
+++ b/kernel/sched/deadline.c
@@ -2574,6 +2574,9 @@ static bool dequeue_task_dl(struct rq *rq, struct task_struct *p, int flags)
*/
static void yield_task_dl(struct rq *rq)
{
+ if (sched_proxy_exec() && rq->curr != rq->donor)
+ return;
+
/*
* We make the task go to sleep until its current deadline by
* forcing its runtime to zero. This way, update_curr_dl() stops
--
2.34.1