mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
sched/fair: Fix pelt lost idle time detection
[ Upstream commit 17e3e88ed0b6318fde0d1c14df1a804711cab1b5 ]
The check for some lost idle pelt time should be always done when
pick_next_task_fair() fails to pick a task and not only when we call it
from the fair fast-path.
The case happens when the last running task on rq is a RT or DL task. When
the latter goes to sleep and the /Sum of util_sum of the rq is at the max
value, we don't account the lost of idle time whereas we should.
Fixes: 67692435c4 ("sched: Rework pick_next_task() slow-path")
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3359a93f45
commit
66c29d9fc1
@@ -8528,21 +8528,21 @@ done: __maybe_unused;
|
||||
return p;
|
||||
|
||||
idle:
|
||||
if (!rf)
|
||||
return NULL;
|
||||
if (rf) {
|
||||
new_tasks = sched_balance_newidle(rq, rf);
|
||||
|
||||
new_tasks = sched_balance_newidle(rq, rf);
|
||||
/*
|
||||
* Because sched_balance_newidle() releases (and re-acquires)
|
||||
* rq->lock, it is possible for any higher priority task to
|
||||
* appear. In that case we must re-start the pick_next_entity()
|
||||
* loop.
|
||||
*/
|
||||
if (new_tasks < 0)
|
||||
return RETRY_TASK;
|
||||
|
||||
/*
|
||||
* Because sched_balance_newidle() releases (and re-acquires) rq->lock, it is
|
||||
* possible for any higher priority task to appear. In that case we
|
||||
* must re-start the pick_next_entity() loop.
|
||||
*/
|
||||
if (new_tasks < 0)
|
||||
return RETRY_TASK;
|
||||
|
||||
if (new_tasks > 0)
|
||||
goto again;
|
||||
if (new_tasks > 0)
|
||||
goto again;
|
||||
}
|
||||
|
||||
/*
|
||||
* rq is about to be idle, check if we need to update the
|
||||
|
||||
Reference in New Issue
Block a user