Messages in this thread Patch in this message | | | Date | Thu, 1 Jun 2023 05:58:16 +0000 | Subject | [PATCH v4 13/13] sched: Fixups to find_exec_ctx | From | John Stultz <> |
| |
find_exec_ctx() would sometimes cause the rt task pushing to try to push tasks in the chain that ends in the rq->curr.
This caused lots of migration noise and effecively livelock where tasks would get pushed off to other cpus, then proxy-migrated back to the lockowner's cpu, over and over.
This kept other cpus constantly proxy-migrating away and never actually selecting a task to run - effectively hanging the system.
So this patch reworks some of the find_exec_ctx logic so we stop when we hit rq->curr, and changes the logic that was returning NULL when we came across rq_selected(), as I'm not sure why we'd stop there.
Cc: Joel Fernandes <joelaf@google.com> Cc: Qais Yousef <qyousef@google.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Juri Lelli <juri.lelli@redhat.com> Cc: Vincent Guittot <vincent.guittot@linaro.org> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com> Cc: Valentin Schneider <vschneid@redhat.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Ben Segall <bsegall@google.com> Cc: Zimuzo Ezeozue <zezeozue@google.com> Cc: Youssef Esmat <youssefesmat@google.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Daniel Bristot de Oliveira <bristot@redhat.com> Cc: Will Deacon <will@kernel.org> Cc: Waiman Long <longman@redhat.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: "Paul E . McKenney" <paulmck@kernel.org> Cc: kernel-team@android.com Signed-off-by: John Stultz <jstultz@google.com> --- kernel/sched/core.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e0e6c2feefd0..9cdabb79d450 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3881,7 +3881,15 @@ struct task_struct *find_exec_ctx(struct rq *rq, struct task_struct *p) if (owner == exec_ctx) break; - if (!task_queued_on_rq(rq, owner) || task_current_selected(rq, owner)) { + /* If we get to current, that's the exec ctx! */ + if (task_current(rq, owner)) + return owner; + + /* + * XXX This previously was checking task_current_selected() + * but that doesnt' make much sense to me. -jstultz + */ + if (!task_queued_on_rq(rq, owner)) { exec_ctx = NULL; break; } -- 2.41.0.rc0.172.g3f132b7071-goog
| |