sched/fair: Picking cpus with low OPPs for tasks that prefer idle CPUs
authorSrinath Sridharan <srinathsr@google.com>
Tue, 2 Aug 2016 21:05:46 +0000 (14:05 -0700)
committerAmit Pundir <amit.pundir@linaro.org>
Wed, 14 Sep 2016 09:32:22 +0000 (15:02 +0530)
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

kernel/sched/fair.c

index 9139e153671a499495983331ba929d4e052534f5..2e08b88cce127ffc8e81ff469b3784ad97fdda46 100644 (file)
@@ -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;
                }