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 <rickyiu@google.com>
This commit is contained in:
Rick Yiu 2020-09-28 21:07:07 +08:00 committed by spakkkk
parent fdab3bbf27
commit 569cba1415

View File

@ -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;
}