[RFC PATCH v2 16/17] sched: Wake up sibling if it has something to run

From: Vineeth Remanan Pillai
Date: Tue Apr 23 2019 - 12:19:14 EST


During core scheduling, it can happen that the current rq selects a
non-tagged process while the sibling might be idling even though it
had something to run (because the sibling selected idle to match the
tagged process in previous tag matching iteration). We need to wake up
the sibling if such a situation arise.

Signed-off-by: Vineeth Remanan Pillai <vpillai@xxxxxxxxxxxxxxxx>
Signed-off-by: Julien Desfossez <jdesfossez@xxxxxxxxxxxxxxxx>
---
kernel/sched/core.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index e8f5ec641d0a..0e3c51a1b54a 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3775,6 +3775,21 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf)
*/
if (i == cpu && !rq->core->core_cookie && !p->core_cookie) {
next = p;
+ rq->core_pick = NULL;
+
+ /*
+ * If the sibling is idling, we might want to wake it
+ * so that it can check for any runnable tasks that did
+ * not get a chance to run due to previous task matching.
+ */
+ for_each_cpu(j, smt_mask) {
+ struct rq *rq_j = cpu_rq(j);
+ rq_j->core_pick = NULL;
+ if (j != cpu &&
+ is_idle_task(rq_j->curr) && rq_j->nr_running) {
+ resched_curr(rq_j);
+ }
+ }
goto done;
}

--
2.17.1