diff options
author | Srinath Sridharan <srinathsr@google.com> | 2016-08-02 14:05:46 -0700 |
---|---|---|
committer | Amit Pundir <amit.pundir@linaro.org> | 2016-09-14 15:02:22 +0530 |
commit | 08786c13717cfc228a84cf3928d91708df7caf0c (patch) | |
tree | d7ea6f3af1b6efdb7d1476ee5e0711f37944dab7 /kernel/sched/fair.c | |
parent | 4d8776f3cc03da1bab0ffa507675ef1e184990c8 (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.c | 21 |
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; } |