sched/fair: Fix enqueue_task_fair warning some more The recent patch, fe61468b2cb (sched/fair: Fix enqueue_task_fair warning) did not fully resolve the issues with the (rq->tmp_alone_branch != &rq->leaf_cfs_rq_list) warning in enqueue_task_fair. There is a case where the first for_each_sched_entity loop exits due to on_rq, having incompletely updated the list. In this case the second for_each_sched_entity loop can further modify se. The later code to fix up the list management fails to do what is needed because se does not point to the sched_entity which broke out of the first loop.
Address this issue by saving the se pointer when the first loop exits and resetting it before doing the fix up, if needed. Signed-off-by: Phil Auld <pa...@redhat.com> Cc: Peter Zijlstra (Intel) <pet...@infradead.org> Cc: Vincent Guittot <vincent.guit...@linaro.org> Cc: Ingo Molnar <mi...@kernel.org> Cc: Juri Lelli <juri.le...@redhat.com> --- kernel/sched/fair.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 02f323b85b6d..719c996317e3 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5432,6 +5432,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) { struct cfs_rq *cfs_rq; struct sched_entity *se = &p->se; + struct sched_entity *saved_se = NULL; int idle_h_nr_running = task_has_idle_policy(p); /* @@ -5466,6 +5467,7 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) flags = ENQUEUE_WAKEUP; } + saved_se = se; for_each_sched_entity(se) { cfs_rq = cfs_rq_of(se); @@ -5510,6 +5512,8 @@ enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags) * leaf list maintenance, resulting in triggering the assertion * below. */ + if (saved_se) + se = saved_se; for_each_sched_entity(se) { cfs_rq = cfs_rq_of(se); -- 2.18.0 Cheers, Phil