Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae8edda2 authored by Srinath Sridharan's avatar Srinath Sridharan Committed by Dmitry Shmidt
Browse files

ANDROID: sched/fair: Favor higher cpus only for boosted tasks



This CL separates the notion of boost and prefer_idle schedtune
attributes in cpu selection. Today only top-app
tasks are boosted. The CPU selection is slightly tweaked such that
higher order cpus are preferred only for boosted tasks (top-app) and the
rest would be skewed towards lower order cpus.
This avoids starvation issues for fg tasks when interacting with high
priority top-app tasks (a problem often seen in the case of system_server).

bug: 30245369
bug: 30292998
Change-Id: I0377e00893b9f6586eec55632a265518fd2fa8a1
Signed-off-by: default avatarAndres Oportus <andresoportus@google.com>

Conflicts:
	kernel/sched/fair.c
parent 6d9689e8
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -6291,7 +6291,7 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target)
	return target;
}

static inline int find_best_target(struct task_struct *p, bool prefer_idle)
static inline int find_best_target(struct task_struct *p, bool boosted, bool prefer_idle)
{
	int iter_cpu;
	int target_cpu = -1;
@@ -6309,9 +6309,9 @@ static inline int find_best_target(struct task_struct *p, bool prefer_idle)
		int idle_idx;

		/*
		 * favor higher cpus for tasks that prefer idle cores
		 * Iterate from higher cpus for boosted tasks.
		 */
		int i = prefer_idle ? NR_CPUS-iter_cpu-1 : iter_cpu;
		int i = boosted ? NR_CPUS-iter_cpu-1 : iter_cpu;

		if (!cpu_online(i) || !cpumask_test_cpu(i, tsk_cpus_allowed(p)))
			continue;
@@ -6481,7 +6481,7 @@ static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync)
		bool boosted = 0;
		bool prefer_idle = 0;
#endif
		int tmp_target = find_best_target(p, boosted || prefer_idle);
		int tmp_target = find_best_target(p, boosted, prefer_idle);
		if (tmp_target >= 0) {
			target_cpu = tmp_target;
			if ((boosted || prefer_idle) && idle_cpu(target_cpu))