diff options
| author | Ke Wang <ke.wang@spreadtrum.com> | 2017-11-01 16:07:38 +0800 |
|---|---|---|
| committer | Todd Kjos <tkjos@google.com> | 2017-11-02 18:01:19 +0000 |
| commit | 47c87b2654376e7dda646ca5a2af067c5d368ca7 (patch) | |
| tree | 93908ba2163daeaff904ebd8baf6586de33db364 /kernel | |
| parent | 7d5a251c66be3516c14cffa80e6b076b37736971 (diff) | |
sched: EAS: Fix the calculation of group util in group_idle_state()
util_delta becomes not zero in eenv_before, which will affect the
calculation of grp_util in group_idle_state(). Fix it under the
new condition.
Change-Id: Ic3853bb45876a8e388afcbe4e72d25fc42b1d7b0
Signed-off-by: Ke Wang <ke.wang@spreadtrum.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched/fair.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 3b429c5ce721..5c65f3ad6da1 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5429,13 +5429,6 @@ static int group_idle_state(struct energy_env *eenv, struct sched_group *sg) /* Take non-cpuidle idling into account (active idle/arch_cpu_idle()) */ state++; - /* - * Try to estimate if a deeper idle state is - * achievable when we move the task. - */ - for_each_cpu(i, sched_group_cpus(sg)) - grp_util += cpu_util(i); - src_in_grp = cpumask_test_cpu(eenv->src_cpu, sched_group_cpus(sg)); dst_in_grp = cpumask_test_cpu(eenv->dst_cpu, sched_group_cpus(sg)); if (src_in_grp == dst_in_grp) { @@ -5444,10 +5437,16 @@ static int group_idle_state(struct energy_env *eenv, struct sched_group *sg) */ goto end; } - /* add or remove util as appropriate to indicate what group util - * will be (worst case - no concurrent execution) after moving the task + + /* + * Try to estimate if a deeper idle state is + * achievable when we move the task. */ - grp_util += src_in_grp ? -eenv->util_delta : eenv->util_delta; + for_each_cpu(i, sched_group_cpus(sg)) { + grp_util += cpu_util_wake(i, eenv->task); + if (unlikely(i == eenv->trg_cpu)) + grp_util += eenv->util_delta; + } if (grp_util <= ((long)sg->sgc->max_capacity * (int)sg->group_weight)) { |
