diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 83ab35e2374f..c80cf449f9fb 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6026,6 +6026,19 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target) return target; } +static unsigned int uclamp_task_util(struct task_struct *p) +{ +#ifdef CONFIG_UCLAMP_TASK + unsigned int min_util = uclamp_eff_value(p, UCLAMP_MIN); + unsigned int max_util = uclamp_eff_value(p, UCLAMP_MAX); + unsigned int est_util = task_util_est(p); + + return clamp(est_util, min_util, max_util); +#else + return task_util_est(p); +#endif +} + /** * Amount of capacity of a CPU that is (estimated to be) used by CFS tasks * @cpu: the CPU to get the utilization of @@ -6370,6 +6383,10 @@ static int find_energy_efficient_cpu(struct task_struct *p, int prev_cpu) if (!fits_capacity(util, cpu_cap)) continue; + /* Skip CPUs which do not fit task requirements */ + if (cpu_cap < uclamp_task_util(p)) + continue; + /* Always use prev_cpu as a candidate. */ if (cpu == prev_cpu) { prev_delta = compute_energy(p, prev_cpu, pd);