Skip to content

Commit 9f6d929

Browse files
vingu-linaroPeter Zijlstra
authored andcommitted
sched/fair: Fix wakeup_preempt_fair() for not waking up task
Make sure to only call pick_next_entity() on an non-empty cfs_rq. The assumption that p is always enqueued and not delayed, is only true for wakeup. If p was moved while delayed, pick_next_entity() will dequeue it and the cfs might become empty. Test if there are still queued tasks before trying again to determine if p could be the next one to be picked. There are at least 2 cases: When cfs becomes idle, it tries to pull tasks but if those pulled tasks are delayed, they will be dequeued when attached to cfs. attach_tasks() -> attach_task() -> wakeup_preempt(rq, p, 0); A misfit task running on cfs A triggers a load balance to be pulled on a better cpu, the load balance on cfs B starts an active load balance to pulled the running misfit task. If there is a delayed dequeue task on cfs A, it can be pulled instead of the previously running misfit task. attach_one_task() -> attach_task() -> wakeup_preempt(rq, p, 0); Fixes: ac8e69e ("sched/fair: Fix wakeup_preempt_fair() vs delayed dequeue") Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://patch.msgid.link/20260503104503.1732682-1-vincent.guittot@linaro.org
1 parent b6eee96 commit 9f6d929

1 file changed

Lines changed: 3 additions & 2 deletions

File tree

kernel/sched/fair.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9174,9 +9174,10 @@ static void wakeup_preempt_fair(struct rq *rq, struct task_struct *p, int wake_f
91749174

91759175
/*
91769176
* Because p is enqueued, nse being null can only mean that we
9177-
* dequeued a delayed task.
9177+
* dequeued a delayed task. If there are still entities queued in
9178+
* cfs, check if the next one will be p.
91789179
*/
9179-
if (!nse)
9180+
if (!nse && cfs_rq->nr_queued)
91809181
goto pick;
91819182

91829183
if (sched_feat(RUN_TO_PARITY))

0 commit comments

Comments
 (0)