mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
Merge tag 'sched_urgent_for_v6.18_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler fixes from Borislav Petkov: - Make sure the check for lost pelt idle time is done unconditionally to have correct lost idle time accounting - Stop the deadline server task before a CPU goes offline * tag 'sched_urgent_for_v6.18_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: sched/fair: Fix pelt lost idle time detection sched/deadline: Stop dl_server before CPU goes offline
This commit is contained in:
@@ -8571,10 +8571,12 @@ int sched_cpu_dying(unsigned int cpu)
|
||||
sched_tick_stop(cpu);
|
||||
|
||||
rq_lock_irqsave(rq, &rf);
|
||||
update_rq_clock(rq);
|
||||
if (rq->nr_running != 1 || rq_has_pinned_tasks(rq)) {
|
||||
WARN(true, "Dying CPU not properly vacated!");
|
||||
dump_rq_tasks(rq, KERN_WARNING);
|
||||
}
|
||||
dl_server_stop(&rq->fair_server);
|
||||
rq_unlock_irqrestore(rq, &rf);
|
||||
|
||||
calc_load_migrate(rq);
|
||||
|
||||
@@ -1582,6 +1582,9 @@ void dl_server_start(struct sched_dl_entity *dl_se)
|
||||
if (!dl_server(dl_se) || dl_se->dl_server_active)
|
||||
return;
|
||||
|
||||
if (WARN_ON_ONCE(!cpu_online(cpu_of(rq))))
|
||||
return;
|
||||
|
||||
dl_se->dl_server_active = 1;
|
||||
enqueue_dl_entity(dl_se, ENQUEUE_WAKEUP);
|
||||
if (!dl_task(dl_se->rq->curr) || dl_entity_preempt(dl_se, &rq->curr->dl))
|
||||
|
||||
@@ -8920,21 +8920,21 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf
|
||||
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