lkml.org 
[lkml]   [2023]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 4/4] energy_model: use a fixed reference frequency
    On Friday 01 Sep 2023 at 15:03:12 (+0200), Vincent Guittot wrote:
    > The last item of a performance domain is not always the performance point
    > that has been used to compute CPU's capacity. This can lead to different
    > target frequency compared with other part of the system like schedutil and
    > would result in wrong energy estimation.
    >
    > a new arch_scale_freq_ref() is available to return a fixed and coherent
    > frequency reference that can be used when computing the CPU's frequency
    > for an level of utilization. Use this function when available or fallback
    > to the last performance domain item otherwise.
    >
    > Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
    > ---
    > include/linux/energy_model.h | 20 +++++++++++++++++---
    > 1 file changed, 17 insertions(+), 3 deletions(-)
    >
    > diff --git a/include/linux/energy_model.h b/include/linux/energy_model.h
    > index b9caa01dfac4..7ee07be6928e 100644
    > --- a/include/linux/energy_model.h
    > +++ b/include/linux/energy_model.h
    > @@ -204,6 +204,20 @@ struct em_perf_state *em_pd_get_efficient_state(struct em_perf_domain *pd,
    > return ps;
    > }
    >
    > +#ifdef arch_scale_freq_ref
    > +static __always_inline
    > +unsigned long arch_scale_freq_ref_em(int cpu, struct em_perf_domain *pd)

    The comments in patch 3/4 should be considered for this function and its
    use as well.

    Thanks,
    Ionela.

    > +{
    > + return arch_scale_freq_ref(cpu);
    > +}
    > +#else
    > +static __always_inline
    > +unsigned long arch_scale_freq_ref_em(int cpu, struct em_perf_domain *pd)
    > +{
    > + return pd->table[pd->nr_perf_states - 1].frequency;
    > +}
    > +#endif
    > +
    > /**
    > * em_cpu_energy() - Estimates the energy consumed by the CPUs of a
    > * performance domain
    > @@ -224,7 +238,7 @@ static inline unsigned long em_cpu_energy(struct em_perf_domain *pd,
    > unsigned long max_util, unsigned long sum_util,
    > unsigned long allowed_cpu_cap)
    > {
    > - unsigned long freq, scale_cpu;
    > + unsigned long freq, ref_freq, scale_cpu;
    > struct em_perf_state *ps;
    > int cpu;
    >
    > @@ -241,11 +255,11 @@ static inline unsigned long em_cpu_energy(struct em_perf_domain *pd,
    > */
    > cpu = cpumask_first(to_cpumask(pd->cpus));
    > scale_cpu = arch_scale_cpu_capacity(cpu);
    > - ps = &pd->table[pd->nr_perf_states - 1];
    > + ref_freq = arch_scale_freq_ref_em(cpu, pd);
    >
    > max_util = map_util_perf(max_util);
    > max_util = min(max_util, allowed_cpu_cap);
    > - freq = map_util_freq(max_util, ps->frequency, scale_cpu);
    > + freq = map_util_freq(max_util, ref_freq, scale_cpu);
    >
    > /*
    > * Find the lowest performance state of the Energy Model above the
    > --
    > 2.34.1
    >
    >

    \
     
     \ /
      Last update: 2023-09-21 21:29    [W:6.213 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site