From 569cba1415a8163b54ee6f9dc8b02a040540c299 Mon Sep 17 00:00:00 2001 From: Rick Yiu Date: Mon, 28 Sep 2020 21:07:07 +0800 Subject: [PATCH] kernel/sched: spread big prefer_idle tasks to little cores Spreading those prefer_idle tasks that are supposed to run on big cores to little cores would help reduce task runnable time. It may help performance in some cases. Bug: 166626809 Test: app launch/uibench/cuj test Change-Id: If496a29128798639db71946fe64847954ff533ca Signed-off-by: Rick Yiu --- kernel/sched/fair.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 47ad1d2af134..da74f2f29dc5 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -7098,10 +7098,6 @@ static int get_start_cpu(struct task_struct *p, bool sync_boost) rd->max_cap_orig_cpu : rd->mid_cap_orig_cpu; } - if (start_cpu == rd->mid_cap_orig_cpu && - !task_demand_fits(p, start_cpu)) - start_cpu = rd->max_cap_orig_cpu; - return start_cpu; } @@ -7132,6 +7128,7 @@ static void find_best_target(struct sched_domain *sd, cpumask_t *cpus, struct sched_group *sg; int best_active_cpu = -1; int best_idle_cpu = -1; + bool idle_fit_cpu_found = false; int best_prioritized_cpu = -1; int target_cpu = -1; int backup_cpu = -1; @@ -7258,11 +7255,19 @@ static void find_best_target(struct sched_domain *sd, cpumask_t *cpus, prioritized_task && !is_min_capacity_cpu(i) && per_cpu(prioritized_task_nr, i) == 0; - if ((!(prefer_idle && idle_cpu(i)) && - !best_prioritized_candidate && - new_util > capacity_orig) || - (is_min_capacity_cpu(i) && - !task_fits_capacity(p, capacity_orig, i))) + if (!(prefer_idle && idle_cpu(i)) && + !best_prioritized_candidate && + new_util > capacity_orig) + continue; + + /* + * If start cpu is mid core, we don't want to loop + * back to little cores, unless the task prefers + * idle cpu and could not find one in mid/max core. + */ + if (!(prefer_idle && idle_fit_cpu_found == false) && + is_min_capacity_cpu(i) && + !task_fits_capacity(p, capacity_orig, i)) continue; /* @@ -7350,6 +7355,11 @@ static void find_best_target(struct sched_domain *sd, cpumask_t *cpus, target_capacity = capacity_orig; shallowest_idle_cstate = idle_idx; best_idle_util = new_util; + + if (is_min_capacity_cpu(start_cpu) == + is_min_capacity_cpu(i)) + idle_fit_cpu_found = true; + best_idle_cpu = i; continue; }