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 <vpil...@digitalocean.com>
Signed-off-by: Julien Desfossez <jdesfos...@digitalocean.com>
---
 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

Reply via email to