summaryrefslogtreecommitdiff
path: root/kernel/sched/fair.c
diff options
context:
space:
mode:
authorSrinath Sridharan <srinathsr@google.com>2016-08-02 14:05:46 -0700
committerAmit Pundir <amit.pundir@linaro.org>2016-09-14 15:02:22 +0530
commit08786c13717cfc228a84cf3928d91708df7caf0c (patch)
treed7ea6f3af1b6efdb7d1476ee5e0711f37944dab7 /kernel/sched/fair.c
parent4d8776f3cc03da1bab0ffa507675ef1e184990c8 (diff)
sched/fair: Picking cpus with low OPPs for tasks that prefer idle CPUs
When idle cpus cannot be found for Top-app/FG tasks, the cpu selection algorithm picks a cpu with lowest OPP amongst the busy cpus as a second choice. Mitigates the "runnable" time for ui and render threads. bug: 30481949 bug: 30342017 bug: 30508678 Change-Id: I5a97e31d33284895c0fa6f6942102713ee576d77
Diffstat (limited to 'kernel/sched/fair.c')
-rw-r--r--kernel/sched/fair.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 9139e153671a..2e08b88cce12 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -5672,10 +5672,22 @@ static inline int find_best_target(struct task_struct *p, bool prefer_idle)
if (new_util < cur_capacity) {
if (cpu_rq(i)->nr_running) {
- if (target_util == 0 ||
- target_util > new_util) {
- target_cpu = i;
- target_util = new_util;
+ if(prefer_idle) {
+ // Find a target cpu with lowest
+ // utilization.
+ if (target_util == 0 ||
+ target_util < new_util) {
+ target_cpu = i;
+ target_util = new_util;
+ }
+ } else {
+ // Find a target cpu with highest
+ // utilization.
+ if (target_util == 0 ||
+ target_util > new_util) {
+ target_cpu = i;
+ target_util = new_util;
+ }
}
} else if (!prefer_idle) {
if (best_idle_cpu < 0 ||
@@ -5687,6 +5699,7 @@ static inline int find_best_target(struct task_struct *p, bool prefer_idle)
}
} else if (backup_capacity == 0 ||
backup_capacity > cur_capacity) {
+ // Find a backup cpu with least capacity.
backup_capacity = cur_capacity;
backup_cpu = i;
}