mirror of
https://github.com/torvalds/linux.git
synced 2026-07-31 03:27:03 +02:00
sched/walt: avoid halted cpus for rt in find_lowest_rq
select_task_rq_rt() and push_rt_task() need to select a cpu, and ultimately attempt to get a good match on a cpu through find_lowest_rq. Walt hooks into this routine to make an adjustment such that the best energy aware cpu is found. It is possible that walt_rt_energy_aware_wake_cpu will be unable to find a non-halted cpu. find_lowest_rq at that point will use the lowest_mask, initialized from the task cpus_ptr, to find a CPU. At this point, find_lowest_rq might return a halted CPU. Instead, in the case where walt cannot find a best cpu to choose, force the lowest_mask to no longer include halted cpus, which will push find_lowest_rq to no longer choose a halted cpu. In the unlikely event that find_lowest_rq still fails to find a cpu it will pick anything from the lowest_mask. In the unlikely event that lowest_mask is empty after removing all of the halted cpus, find_lowest_rq will fail and the cpu chosen will be unconstrained by halt. Change-Id: I398bc804eb474396f6f06e2c3d4308fea71dafe8 Signed-off-by: Stephen Dickey <quic_dickey@quicinc.com>
This commit is contained in:
parent
dcbd6c7246
commit
612b4f86c1
|
|
@ -10,8 +10,8 @@
|
|||
|
||||
static DEFINE_PER_CPU(cpumask_var_t, walt_local_cpu_mask);
|
||||
|
||||
static void walt_rt_energy_aware_wake_cpu(void *unused, struct task_struct *task,
|
||||
struct cpumask *lowest_mask, int ret, int *best_cpu)
|
||||
static void walt_rt_energy_aware_wake_cpu(struct task_struct *task, struct cpumask *lowest_mask,
|
||||
int ret, int *best_cpu)
|
||||
{
|
||||
int cpu;
|
||||
unsigned long util, best_cpu_util = ULONG_MAX;
|
||||
|
|
@ -205,7 +205,7 @@ static void walt_select_task_rq_rt(void *unused, struct task_struct *task, int c
|
|||
ret = cpupri_find_fitness(&task_rq(task)->rd->cpupri, task,
|
||||
lowest_mask, walt_rt_task_fits_capacity);
|
||||
|
||||
walt_rt_energy_aware_wake_cpu(NULL, task, lowest_mask, ret, &target);
|
||||
walt_rt_energy_aware_wake_cpu(task, lowest_mask, ret, &target);
|
||||
|
||||
/*
|
||||
* If cpu is non-preemptible, prefer remote cpu
|
||||
|
|
@ -220,6 +220,22 @@ static void walt_select_task_rq_rt(void *unused, struct task_struct *task, int c
|
|||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
|
||||
static void walt_rt_find_lowest_rq(void *unused, struct task_struct *task,
|
||||
struct cpumask *lowest_mask, int ret, int *best_cpu)
|
||||
|
||||
{
|
||||
walt_rt_energy_aware_wake_cpu(task, lowest_mask, ret, best_cpu);
|
||||
|
||||
/*
|
||||
* Walt was not able to find a non-halted best cpu. Ensure that
|
||||
* find_lowest_rq doesn't use a halted cpu going forward, but
|
||||
* does a best effort itself to find a good CPU.
|
||||
*/
|
||||
if (*best_cpu == -1)
|
||||
cpumask_andnot(lowest_mask, lowest_mask, cpu_halt_mask);
|
||||
}
|
||||
|
||||
void walt_rt_init(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
|
@ -233,5 +249,5 @@ void walt_rt_init(void)
|
|||
}
|
||||
|
||||
register_trace_android_rvh_select_task_rq_rt(walt_select_task_rq_rt, NULL);
|
||||
register_trace_android_rvh_find_lowest_rq(walt_rt_energy_aware_wake_cpu, NULL);
|
||||
register_trace_android_rvh_find_lowest_rq(walt_rt_find_lowest_rq, NULL);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user