Messages in this thread | | | From | Valentin Schneider <> | Subject | Re: [PATCH v2 9/9] sched/fair: Consider capacity inversion in util_fits_cpu() | Date | Fri, 04 Nov 2022 17:35:36 +0000 |
| |
On 04/08/22 15:36, Qais Yousef wrote: > We do consider thermal pressure in util_fits_cpu() for uclamp_min only. > With the exception of the biggest cores which by definition are the max > performance point of the system and all tasks by definition should fit. > > Even under thermal pressure, the capacity of the biggest CPU is the > highest in the system and should still fit every task. Except when it > reaches capacity inversion point, then this is no longer true. > > We can handle this by using the inverted capacity as capacity_orig in > util_fits_cpu(). Which not only addresses the problem above, but also > ensure uclamp_max now considers the inverted capacity. Force fitting > a task when a CPU is in this adverse state will contribute to making the > thermal throttling last longer. > > Signed-off-by: Qais Yousef <qais.yousef@arm.com> > --- > kernel/sched/fair.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index cb32dc9a057f..77ae343e32a3 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -4293,12 +4293,16 @@ static inline int util_fits_cpu(unsigned long util, > * For uclamp_max, we can tolerate a drop in performance level as the > * goal is to cap the task. So it's okay if it's getting less. > * > - * In case of capacity inversion, which is not handled yet, we should > - * honour the inverted capacity for both uclamp_min and uclamp_max all > - * the time. > + * In case of capacity inversion we should honour the inverted capacity > + * for both uclamp_min and uclamp_max all the time. > */ > - capacity_orig = capacity_orig_of(cpu); > - capacity_orig_thermal = capacity_orig - arch_scale_thermal_pressure(cpu); > + capacity_orig = cpu_in_capacity_inversion(cpu); > + if (capacity_orig) { > + capacity_orig_thermal = capacity_orig; > + } else { > + capacity_orig = capacity_orig_of(cpu); > + capacity_orig_thermal = capacity_orig - arch_scale_thermal_pressure(cpu); > + } >
IIUC the rq->cpu_capacity_inverted computation in update_cpu_capacity() can be summarised as:
- If there is a PD with equal cap_orig, but higher effective (orig - thermal) capacity OR there is a PD with pd_cap_orig > cpu_effective_cap: rq->cpu_capacity_inverted = capacity_orig - thermal_load_avg(rq)
- Else: rq->cpu_capacity_inverted = 0
Then, the code above uses either rq->cpu_capacity_inverted if it is non-zero, otherwise:
capacity_orig - arch_scale_thermal_pressure(cpu);
Why use average thermal pressure in one case, and use instantaneous thermal pressure in the other?
Can't we get rid of rq->cpu_capacity_inverted and replace this whole thing with an unconditional
capacity_orig_thermal = capacity_orig_of(cpu) - thermal_load_avg(cpu_rq(cpu));
?
> /* > * We want to force a task to fit a cpu as implied by uclamp_max. > -- > 2.25.1
| |