summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}