[RESEND][PATCH v31 1/9] sched/deadline: Ignore proxy-exec sched_yield()
John Stultz <[email protected]>
| Newsgroups | org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
From: Christian Loehle <[email protected]> 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") Acked-by: Juri Lelli <[email protected]> Signed-off-by: Christian Loehle <[email protected]> Signed-off-by: John Stultz <[email protected]> --- Cc: Joel Fernandes <[email protected]> Cc: Qais Yousef <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Juri Lelli <[email protected]> Cc: Vincent Guittot <[email protected]> Cc: Dietmar Eggemann <[email protected]> Cc: Valentin Schneider <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Ben Segall <[email protected]> Cc: Zimuzo Ezeozue <[email protected]> Cc: Will Deacon <[email protected]> Cc: Waiman Long <[email protected]> Cc: Boqun Feng <[email protected]> Cc: "Paul E. McKenney" <[email protected]> Cc: Metin Kaya <[email protected]> Cc: Xuewen Yan <[email protected]> Cc: K Prateek Nayak <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Daniel Lezcano <[email protected]> Cc: Suleiman Souhlal <[email protected]> Cc: Andrea Righi <[email protected]> Cc: kuyo chang <[email protected]> Cc: hupu <[email protected]> Cc: [email protected] --- kernel/sched/deadline.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 0f858b98c9aa3..3e89b3abeb278 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.55.0.654.g21b8a5bc05-goog