Re: [PATCH V3 1/2] topology: Allow multiple entities to provide sched_freq_tick() callback

From: Ionela Voinescu
Date: Wed Feb 03 2021 - 06:46:41 EST


Hi Viresh,

Many thanks for the renaming of functions/variables/enums.

I've cropped all the code that looks good to me, and I kept some
portions of interest.

On Thursday 28 Jan 2021 at 16:18:55 (+0530), Viresh Kumar wrote:
> This patch attempts to make it generic enough so other parts of the
> kernel can also provide their own implementation of scale_freq_tick()
> callback, which is called by the scheduler periodically to update the
> per-cpu freq_scale variable.
[..]
> static void amu_fie_setup(const struct cpumask *cpus)
> {
> @@ -227,7 +263,7 @@ static void amu_fie_setup(const struct cpumask *cpus)
> if (!invariant && !cpumask_equal(amu_fie_cpus, cpu_present_mask))
> return;
>
> - static_branch_enable(&amu_fie_key);
> + topology_set_scale_freq_source(&amu_sfd, amu_fie_cpus);
>
> pr_debug("CPUs[%*pbl]: counters will be used for FIE.",
> cpumask_pr_args(cpus));
> @@ -283,53 +319,6 @@ static int __init init_amu_fie(void)
> }
> core_initcall(init_amu_fie);
[..]
> +void topology_set_scale_freq_source(struct scale_freq_data *data,
> + const struct cpumask *cpus)
> +{
> + struct scale_freq_data *sfd;
> + int cpu;
> +
> + for_each_cpu(cpu, cpus) {
> + sfd = per_cpu(sft_data, cpu);
> +
> + /* Use ARCH provided counters whenever possible */
> + if (!sfd || sfd->source != SCALE_FREQ_SOURCE_ARCH) {
> + per_cpu(sft_data, cpu) = data;
> + cpumask_set_cpu(cpu, &scale_freq_counters_mask);
> + }
> + }
> }
> +EXPORT_SYMBOL_GPL(topology_set_scale_freq_source);
[..]

I have one single comment left for this patch, and apologies in advance
for the long story.

In general, for frequency invariance, we're interested in whether the full
system is frequency invariant as well, for two reasons:
- We want to be able to either set a scale factor for all CPUs or none
at all.
- If at some point during the boot process the system invariance status
changes, we want to be able to inform dependents: schedutil and EAS.

This management is currently done on amu_fie_setup(), because before
these patches we only had two sources for frequency invariance: cpufreq
and AMU counters. But that's not enough after these two patches, from
both functional and code design point of view.

I have to mention that your code will work as it is for now, but only
because CPPC is the new other source of counters, and for CPPC we also
have cpufreq invariance available. But this only hides what can become a
problem later: if in the future we won't have cpufreq invariance for
CPPC or if another provider of counters is added and used in a system
without cpufreq invariance, the late initialization of these counters
will either break schedutil/scheduler if not all CPUs support those
counters, or keep EAS disabled, even if all CPUs support these counters,
and frequency invariance is later enabled.

Therefore, I think system level invariance management (checks and
call to rebuild_sched_domains_energy()) also needs to move from arm64
code to arch_topology code.

Thanks,
Ionela.