Commit d9043c79 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents 343b4b44 17e3e88e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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))
+13 −13
Original line number Diff line number Diff line
@@ -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);

		/*
	 * 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.
		 * 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;
	}

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