Skip to content

Commit d9043c7

Browse files
committed
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
2 parents 343b4b4 + 17e3e88 commit d9043c7

File tree

3 files changed

+18
-13
lines changed

3 files changed

+18
-13
lines changed

kernel/sched/core.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8571,10 +8571,12 @@ int sched_cpu_dying(unsigned int cpu)
85718571
sched_tick_stop(cpu);
85728572

85738573
rq_lock_irqsave(rq, &rf);
8574+
update_rq_clock(rq);
85748575
if (rq->nr_running != 1 || rq_has_pinned_tasks(rq)) {
85758576
WARN(true, "Dying CPU not properly vacated!");
85768577
dump_rq_tasks(rq, KERN_WARNING);
85778578
}
8579+
dl_server_stop(&rq->fair_server);
85788580
rq_unlock_irqrestore(rq, &rf);
85798581

85808582
calc_load_migrate(rq);

kernel/sched/deadline.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,6 +1582,9 @@ void dl_server_start(struct sched_dl_entity *dl_se)
15821582
if (!dl_server(dl_se) || dl_se->dl_server_active)
15831583
return;
15841584

1585+
if (WARN_ON_ONCE(!cpu_online(cpu_of(rq))))
1586+
return;
1587+
15851588
dl_se->dl_server_active = 1;
15861589
enqueue_dl_entity(dl_se, ENQUEUE_WAKEUP);
15871590
if (!dl_task(dl_se->rq->curr) || dl_entity_preempt(dl_se, &rq->curr->dl))

kernel/sched/fair.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8920,21 +8920,21 @@ pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf
89208920
return p;
89218921

89228922
idle:
8923-
if (!rf)
8924-
return NULL;
8925-
8926-
new_tasks = sched_balance_newidle(rq, rf);
8923+
if (rf) {
8924+
new_tasks = sched_balance_newidle(rq, rf);
89278925

8928-
/*
8929-
* Because sched_balance_newidle() releases (and re-acquires) rq->lock, it is
8930-
* possible for any higher priority task to appear. In that case we
8931-
* must re-start the pick_next_entity() loop.
8932-
*/
8933-
if (new_tasks < 0)
8934-
return RETRY_TASK;
8926+
/*
8927+
* Because sched_balance_newidle() releases (and re-acquires)
8928+
* rq->lock, it is possible for any higher priority task to
8929+
* appear. In that case we must re-start the pick_next_entity()
8930+
* loop.
8931+
*/
8932+
if (new_tasks < 0)
8933+
return RETRY_TASK;
89358934

8936-
if (new_tasks > 0)
8937-
goto again;
8935+
if (new_tasks > 0)
8936+
goto again;
8937+
}
89388938

89398939
/*
89408940
* rq is about to be idle, check if we need to update the

0 commit comments

Comments
 (0)