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: Chris Redpath <chris.redpath@arm.com>
This commit is contained in:
parent
bf93a3672c
commit
74b4fa8e5c
1 changed files with 18 additions and 0 deletions
|
@ -8322,6 +8322,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;
|
||||
|
||||
idle_enter_fair(this_rq);
|
||||
|
||||
|
@ -8345,6 +8346,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) {
|
||||
|
@ -8409,6 +8421,12 @@ out:
|
|||
if (pulled_task) {
|
||||
idle_exit_fair(this_rq);
|
||||
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;
|
||||
|
|
Loading…
Add table
Reference in a new issue