Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d9689e8 authored by Juri Lelli's avatar Juri Lelli Committed by Dmitry Shmidt
Browse files

ANDROID: sched/fair: call OPP update when going idle after migration



When a task leaves a rq because it is migrated away it carries its
utilization with him. In this case and OPP update on the src rq might be
needed. The corresponding update at dst rq will happen at enqueue time.

Change-Id: I22754a43760fc8d22a488fe15044af93787ea7a8

sched/fair: Fix uninitialised variable in idle_balance

compiler warned, looks legit.

Signed-off-by: default avatarChris Redpath <chris.redpath@arm.com>
Signed-off-by: default avatarAndres Oportus <andresoportus@google.com>
parent 63442063
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -8972,6 +8972,7 @@ static int idle_balance(struct rq *this_rq)
	struct sched_domain *sd;
	int pulled_task = 0;
	u64 curr_cost = 0;
	long removed_util=0;

	/*
	 * We must set idle_stamp _before_ calling idle_balance(), such that we
@@ -8993,6 +8994,17 @@ static int idle_balance(struct rq *this_rq)

	raw_spin_unlock(&this_rq->lock);

	/*
	 * If removed_util_avg is !0 we most probably migrated some task away
	 * from this_cpu. In this case we might be willing to trigger an OPP
	 * update, but we want to do so if we don't find anybody else to pull
	 * here (we will trigger an OPP update with the pulled task's enqueue
	 * anyway).
	 *
	 * Record removed_util before calling update_blocked_averages, and use
	 * it below (before returning) to see if an OPP update is required.
	 */
	removed_util = atomic_long_read(&(this_rq->cfs).removed_util_avg);
	update_blocked_averages(this_cpu);
	rcu_read_lock();
	for_each_domain(this_cpu, sd) {
@@ -9056,6 +9068,13 @@ static int idle_balance(struct rq *this_rq)

	if (pulled_task)
		this_rq->idle_stamp = 0;
	else if (removed_util) {
		/*
		 * No task pulled and someone has been migrated away.
		 * Good case to trigger an OPP update.
		 */
		update_capacity_of(this_cpu);
	}

	return pulled_task;
}