From: Ionela Voinescu <ionela.voinescu@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: juri.lelli@redhat.com, peterz@infradead.org,
catalin.marinas@arm.com, robert.moore@intel.com,
bsegall@google.com, conor.dooley@microchip.com,
pierre.gondois@arm.com, linux-riscv@lists.infradead.org,
will@kernel.org, acpica-devel@lists.linuxfoundation.org,
vschneid@redhat.com, linux@armlinux.org.uk,
linux-acpi@vger.kernel.org, mingo@redhat.com, mgorman@suse.de,
lftan@kernel.org, viresh.kumar@linaro.org, lenb@kernel.org,
aou@eecs.berkeley.edu, linux-pm@vger.kernel.org,
rostedt@goodmis.org, paul.walmsley@sifive.com,
dietmar.eggemann@arm.com, linux-arm-kernel@lists.infradead.org,
gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org,
palmer@dabbelt.com, sudeep.holla@arm.com, suagrfillet@gmail.com,
ajones@ventanamicro.com, bristot@redhat.com, lukasz.luba@arm.com
Subject: Re: [Acpica-devel] [RFC v3 6/6] arm64/amu: use capacity_ref_freq to set AMU ratio
Date: Mon, 23 Oct 2023 21:58:32 +0100 [thread overview]
Message-ID: <ZTbebQrK3K+JwWxR@arm.com> (raw)
In-Reply-To: <20231018162540.667646-7-vincent.guittot@linaro.org>
Hi,
On Wednesday 18 Oct 2023 at 18:25:40 (+0200), Vincent Guittot wrote:
> Use the new capacity_ref_freq to set the ratio that is used by AMU for
> computing the arch_scale_freq_capacity().
> This helps to keep everything aligned using the same reference for
> computing CPUs capacity.
>
> The default value of the ratio ensures that arch_scale_freq_capacity()
> returns max capacity until it is set to its correct value with the
> cpu capacity and capacity_ref_freq.
>
> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
> ---
> arch/arm64/kernel/topology.c | 18 ++++++++++--------
> drivers/base/arch_topology.c | 14 ++++++++++++--
> include/linux/arch_topology.h | 1 +
> 3 files changed, 23 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
> index 817d788cd866..0f8f6e90c46d 100644
> --- a/arch/arm64/kernel/topology.c
> +++ b/arch/arm64/kernel/topology.c
> @@ -82,7 +82,12 @@ int __init parse_acpi_topology(void)
> #undef pr_fmt
> #define pr_fmt(fmt) "AMU: " fmt
>
> -static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale);
> +/*
> + * Ensure that amu_scale_freq_tick() will return SCHED_CAPACITY_SHIFT until
> + * the CPU capacity and its assosciated frequency have been correctly
> + * initialized.
s/SCHED_CAPACITY_SHIFT/SCHED_CAPACITY_SCALE
> + */
> +static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale) = (2 * SCHED_CAPACITY_SHIFT);
It should be 1UL << (2 * SCHED_CAPACITY_SHIFT).
> static DEFINE_PER_CPU(u64, arch_const_cycles_prev);
> static DEFINE_PER_CPU(u64, arch_core_cycles_prev);
> static cpumask_var_t amu_fie_cpus;
> @@ -112,9 +117,9 @@ static inline bool freq_counters_valid(int cpu)
> return true;
> }
>
> -static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate)
> {
> - u64 ratio;
> + u64 ratio, ref_rate = arch_timer_get_rate();
>
> if (unlikely(!max_rate || !ref_rate)) {
> pr_debug("CPU%d: invalid maximum or reference frequency.\n",
> @@ -142,7 +147,7 @@ static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> return -EINVAL;
> }
The return value is no longer used so it might be worth declaring it to
return void and WARN_ONCE for unlikely(!max_rate || !ref_rate).
>
> - per_cpu(arch_max_freq_scale, cpu) = (unsigned long)ratio;
> + WRITE_ONCE(per_cpu(arch_max_freq_scale, cpu), (unsigned long)ratio);
>
> return 0;
> }
> @@ -195,10 +200,7 @@ static void amu_fie_setup(const struct cpumask *cpus)
> return;
>
> for_each_cpu(cpu, cpus) {
> - if (!freq_counters_valid(cpu) ||
> - freq_inv_set_max_ratio(cpu,
> - cpufreq_get_hw_max_freq(cpu) * 1000ULL,
> - arch_timer_get_rate()))
> + if (!freq_counters_valid(cpu))
> return;
> }
>
> diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
> index 2372ce791bb4..3a604b77b12d 100644
> --- a/drivers/base/arch_topology.c
> +++ b/drivers/base/arch_topology.c
> @@ -344,6 +344,11 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
> return !ret;
> }
>
> +int __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
> +{
> + return 0;
> +}
> +
> #ifdef CONFIG_ACPI_CPPC_LIB
> #include <acpi/cppc_acpi.h>
>
> @@ -369,7 +374,6 @@ void topology_init_cpu_capacity_cppc(void)
> capacity_scale = max_t(u64, capacity_scale, raw_capacity[cpu]);
>
> per_cpu(capacity_ref_freq, cpu) = cppc_perf_to_khz(&perf_caps, raw_capacity[cpu]);
> -
> pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n",
> cpu, raw_capacity[cpu]);
> continue;
> @@ -381,6 +385,9 @@ void topology_init_cpu_capacity_cppc(void)
> }
>
> for_each_possible_cpu(cpu) {
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
> +
> capacity = raw_capacity[cpu];
> capacity = div64_u64(capacity << SCHED_CAPACITY_SHIFT,
> capacity_scale);
> @@ -422,8 +429,11 @@ init_cpu_capacity_callback(struct notifier_block *nb,
>
> cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->related_cpus);
>
> - for_each_cpu(cpu, policy->related_cpus)
> + for_each_cpu(cpu, policy->related_cpus) {
> per_cpu(capacity_ref_freq, cpu) = policy->cpuinfo.max_freq;
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
capacity_ref_freq is in KHz while arch_timer_get_rate() is in Hz. One or
the other needs to be scaled.
The same in topology_init_cpu_capacity_cppc().
Thanks,
Ionela.
> + }
>
> if (cpumask_empty(cpus_to_visit)) {
> topology_normalize_cpu_scale();
> diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
> index 38ca6c76af56..b6e95d763279 100644
> --- a/include/linux/arch_topology.h
> +++ b/include/linux/arch_topology.h
> @@ -99,6 +99,7 @@ void update_siblings_masks(unsigned int cpu);
> void remove_cpu_topology(unsigned int cpuid);
> void reset_cpu_topology(void);
> int parse_acpi_topology(void);
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate);
> #endif
>
> #endif /* _LINUX_ARCH_TOPOLOGY_H_ */
> --
> 2.34.1
>
WARNING: multiple messages have this Message-ID (diff)
From: Ionela Voinescu <ionela.voinescu@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: linux@armlinux.org.uk, catalin.marinas@arm.com, will@kernel.org,
paul.walmsley@sifive.com, palmer@dabbelt.com,
aou@eecs.berkeley.edu, sudeep.holla@arm.com,
gregkh@linuxfoundation.org, rafael@kernel.org, mingo@redhat.com,
peterz@infradead.org, juri.lelli@redhat.com,
dietmar.eggemann@arm.com, rostedt@goodmis.org,
bsegall@google.com, mgorman@suse.de, bristot@redhat.com,
vschneid@redhat.com, viresh.kumar@linaro.org, lenb@kernel.org,
robert.moore@intel.com, lukasz.luba@arm.com,
pierre.gondois@arm.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org,
linux-pm@vger.kernel.org, linux-acpi@vger.kernel.org,
acpica-devel@lists.linuxfoundation.org,
conor.dooley@microchip.com, suagrfillet@gmail.com,
ajones@ventanamicro.com, lftan@kernel.org
Subject: Re: [RFC v3 6/6] arm64/amu: use capacity_ref_freq to set AMU ratio
Date: Mon, 23 Oct 2023 21:58:32 +0100 [thread overview]
Message-ID: <ZTbebQrK3K+JwWxR@arm.com> (raw)
In-Reply-To: <20231018162540.667646-7-vincent.guittot@linaro.org>
Hi,
On Wednesday 18 Oct 2023 at 18:25:40 (+0200), Vincent Guittot wrote:
> Use the new capacity_ref_freq to set the ratio that is used by AMU for
> computing the arch_scale_freq_capacity().
> This helps to keep everything aligned using the same reference for
> computing CPUs capacity.
>
> The default value of the ratio ensures that arch_scale_freq_capacity()
> returns max capacity until it is set to its correct value with the
> cpu capacity and capacity_ref_freq.
>
> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
> ---
> arch/arm64/kernel/topology.c | 18 ++++++++++--------
> drivers/base/arch_topology.c | 14 ++++++++++++--
> include/linux/arch_topology.h | 1 +
> 3 files changed, 23 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
> index 817d788cd866..0f8f6e90c46d 100644
> --- a/arch/arm64/kernel/topology.c
> +++ b/arch/arm64/kernel/topology.c
> @@ -82,7 +82,12 @@ int __init parse_acpi_topology(void)
> #undef pr_fmt
> #define pr_fmt(fmt) "AMU: " fmt
>
> -static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale);
> +/*
> + * Ensure that amu_scale_freq_tick() will return SCHED_CAPACITY_SHIFT until
> + * the CPU capacity and its assosciated frequency have been correctly
> + * initialized.
s/SCHED_CAPACITY_SHIFT/SCHED_CAPACITY_SCALE
> + */
> +static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale) = (2 * SCHED_CAPACITY_SHIFT);
It should be 1UL << (2 * SCHED_CAPACITY_SHIFT).
> static DEFINE_PER_CPU(u64, arch_const_cycles_prev);
> static DEFINE_PER_CPU(u64, arch_core_cycles_prev);
> static cpumask_var_t amu_fie_cpus;
> @@ -112,9 +117,9 @@ static inline bool freq_counters_valid(int cpu)
> return true;
> }
>
> -static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate)
> {
> - u64 ratio;
> + u64 ratio, ref_rate = arch_timer_get_rate();
>
> if (unlikely(!max_rate || !ref_rate)) {
> pr_debug("CPU%d: invalid maximum or reference frequency.\n",
> @@ -142,7 +147,7 @@ static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> return -EINVAL;
> }
The return value is no longer used so it might be worth declaring it to
return void and WARN_ONCE for unlikely(!max_rate || !ref_rate).
>
> - per_cpu(arch_max_freq_scale, cpu) = (unsigned long)ratio;
> + WRITE_ONCE(per_cpu(arch_max_freq_scale, cpu), (unsigned long)ratio);
>
> return 0;
> }
> @@ -195,10 +200,7 @@ static void amu_fie_setup(const struct cpumask *cpus)
> return;
>
> for_each_cpu(cpu, cpus) {
> - if (!freq_counters_valid(cpu) ||
> - freq_inv_set_max_ratio(cpu,
> - cpufreq_get_hw_max_freq(cpu) * 1000ULL,
> - arch_timer_get_rate()))
> + if (!freq_counters_valid(cpu))
> return;
> }
>
> diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
> index 2372ce791bb4..3a604b77b12d 100644
> --- a/drivers/base/arch_topology.c
> +++ b/drivers/base/arch_topology.c
> @@ -344,6 +344,11 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
> return !ret;
> }
>
> +int __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
> +{
> + return 0;
> +}
> +
> #ifdef CONFIG_ACPI_CPPC_LIB
> #include <acpi/cppc_acpi.h>
>
> @@ -369,7 +374,6 @@ void topology_init_cpu_capacity_cppc(void)
> capacity_scale = max_t(u64, capacity_scale, raw_capacity[cpu]);
>
> per_cpu(capacity_ref_freq, cpu) = cppc_perf_to_khz(&perf_caps, raw_capacity[cpu]);
> -
> pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n",
> cpu, raw_capacity[cpu]);
> continue;
> @@ -381,6 +385,9 @@ void topology_init_cpu_capacity_cppc(void)
> }
>
> for_each_possible_cpu(cpu) {
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
> +
> capacity = raw_capacity[cpu];
> capacity = div64_u64(capacity << SCHED_CAPACITY_SHIFT,
> capacity_scale);
> @@ -422,8 +429,11 @@ init_cpu_capacity_callback(struct notifier_block *nb,
>
> cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->related_cpus);
>
> - for_each_cpu(cpu, policy->related_cpus)
> + for_each_cpu(cpu, policy->related_cpus) {
> per_cpu(capacity_ref_freq, cpu) = policy->cpuinfo.max_freq;
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
capacity_ref_freq is in KHz while arch_timer_get_rate() is in Hz. One or
the other needs to be scaled.
The same in topology_init_cpu_capacity_cppc().
Thanks,
Ionela.
> + }
>
> if (cpumask_empty(cpus_to_visit)) {
> topology_normalize_cpu_scale();
> diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
> index 38ca6c76af56..b6e95d763279 100644
> --- a/include/linux/arch_topology.h
> +++ b/include/linux/arch_topology.h
> @@ -99,6 +99,7 @@ void update_siblings_masks(unsigned int cpu);
> void remove_cpu_topology(unsigned int cpuid);
> void reset_cpu_topology(void);
> int parse_acpi_topology(void);
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate);
> #endif
>
> #endif /* _LINUX_ARCH_TOPOLOGY_H_ */
> --
> 2.34.1
>
WARNING: multiple messages have this Message-ID (diff)
From: Ionela Voinescu <ionela.voinescu@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: linux@armlinux.org.uk, catalin.marinas@arm.com, will@kernel.org,
paul.walmsley@sifive.com, palmer@dabbelt.com,
aou@eecs.berkeley.edu, sudeep.holla@arm.com,
gregkh@linuxfoundation.org, rafael@kernel.org, mingo@redhat.com,
peterz@infradead.org, juri.lelli@redhat.com,
dietmar.eggemann@arm.com, rostedt@goodmis.org,
bsegall@google.com, mgorman@suse.de, bristot@redhat.com,
vschneid@redhat.com, viresh.kumar@linaro.org, lenb@kernel.org,
robert.moore@intel.com, lukasz.luba@arm.com,
pierre.gondois@arm.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org,
linux-pm@vger.kernel.org, linux-acpi@vger.kernel.org,
acpica-devel@lists.linuxfoundation.org,
conor.dooley@microchip.com, suagrfillet@gmail.com,
ajones@ventanamicro.com, lftan@kernel.org
Subject: Re: [RFC v3 6/6] arm64/amu: use capacity_ref_freq to set AMU ratio
Date: Mon, 23 Oct 2023 21:58:32 +0100 [thread overview]
Message-ID: <ZTbebQrK3K+JwWxR@arm.com> (raw)
In-Reply-To: <20231018162540.667646-7-vincent.guittot@linaro.org>
Hi,
On Wednesday 18 Oct 2023 at 18:25:40 (+0200), Vincent Guittot wrote:
> Use the new capacity_ref_freq to set the ratio that is used by AMU for
> computing the arch_scale_freq_capacity().
> This helps to keep everything aligned using the same reference for
> computing CPUs capacity.
>
> The default value of the ratio ensures that arch_scale_freq_capacity()
> returns max capacity until it is set to its correct value with the
> cpu capacity and capacity_ref_freq.
>
> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
> ---
> arch/arm64/kernel/topology.c | 18 ++++++++++--------
> drivers/base/arch_topology.c | 14 ++++++++++++--
> include/linux/arch_topology.h | 1 +
> 3 files changed, 23 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
> index 817d788cd866..0f8f6e90c46d 100644
> --- a/arch/arm64/kernel/topology.c
> +++ b/arch/arm64/kernel/topology.c
> @@ -82,7 +82,12 @@ int __init parse_acpi_topology(void)
> #undef pr_fmt
> #define pr_fmt(fmt) "AMU: " fmt
>
> -static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale);
> +/*
> + * Ensure that amu_scale_freq_tick() will return SCHED_CAPACITY_SHIFT until
> + * the CPU capacity and its assosciated frequency have been correctly
> + * initialized.
s/SCHED_CAPACITY_SHIFT/SCHED_CAPACITY_SCALE
> + */
> +static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale) = (2 * SCHED_CAPACITY_SHIFT);
It should be 1UL << (2 * SCHED_CAPACITY_SHIFT).
> static DEFINE_PER_CPU(u64, arch_const_cycles_prev);
> static DEFINE_PER_CPU(u64, arch_core_cycles_prev);
> static cpumask_var_t amu_fie_cpus;
> @@ -112,9 +117,9 @@ static inline bool freq_counters_valid(int cpu)
> return true;
> }
>
> -static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate)
> {
> - u64 ratio;
> + u64 ratio, ref_rate = arch_timer_get_rate();
>
> if (unlikely(!max_rate || !ref_rate)) {
> pr_debug("CPU%d: invalid maximum or reference frequency.\n",
> @@ -142,7 +147,7 @@ static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> return -EINVAL;
> }
The return value is no longer used so it might be worth declaring it to
return void and WARN_ONCE for unlikely(!max_rate || !ref_rate).
>
> - per_cpu(arch_max_freq_scale, cpu) = (unsigned long)ratio;
> + WRITE_ONCE(per_cpu(arch_max_freq_scale, cpu), (unsigned long)ratio);
>
> return 0;
> }
> @@ -195,10 +200,7 @@ static void amu_fie_setup(const struct cpumask *cpus)
> return;
>
> for_each_cpu(cpu, cpus) {
> - if (!freq_counters_valid(cpu) ||
> - freq_inv_set_max_ratio(cpu,
> - cpufreq_get_hw_max_freq(cpu) * 1000ULL,
> - arch_timer_get_rate()))
> + if (!freq_counters_valid(cpu))
> return;
> }
>
> diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
> index 2372ce791bb4..3a604b77b12d 100644
> --- a/drivers/base/arch_topology.c
> +++ b/drivers/base/arch_topology.c
> @@ -344,6 +344,11 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
> return !ret;
> }
>
> +int __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
> +{
> + return 0;
> +}
> +
> #ifdef CONFIG_ACPI_CPPC_LIB
> #include <acpi/cppc_acpi.h>
>
> @@ -369,7 +374,6 @@ void topology_init_cpu_capacity_cppc(void)
> capacity_scale = max_t(u64, capacity_scale, raw_capacity[cpu]);
>
> per_cpu(capacity_ref_freq, cpu) = cppc_perf_to_khz(&perf_caps, raw_capacity[cpu]);
> -
> pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n",
> cpu, raw_capacity[cpu]);
> continue;
> @@ -381,6 +385,9 @@ void topology_init_cpu_capacity_cppc(void)
> }
>
> for_each_possible_cpu(cpu) {
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
> +
> capacity = raw_capacity[cpu];
> capacity = div64_u64(capacity << SCHED_CAPACITY_SHIFT,
> capacity_scale);
> @@ -422,8 +429,11 @@ init_cpu_capacity_callback(struct notifier_block *nb,
>
> cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->related_cpus);
>
> - for_each_cpu(cpu, policy->related_cpus)
> + for_each_cpu(cpu, policy->related_cpus) {
> per_cpu(capacity_ref_freq, cpu) = policy->cpuinfo.max_freq;
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
capacity_ref_freq is in KHz while arch_timer_get_rate() is in Hz. One or
the other needs to be scaled.
The same in topology_init_cpu_capacity_cppc().
Thanks,
Ionela.
> + }
>
> if (cpumask_empty(cpus_to_visit)) {
> topology_normalize_cpu_scale();
> diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
> index 38ca6c76af56..b6e95d763279 100644
> --- a/include/linux/arch_topology.h
> +++ b/include/linux/arch_topology.h
> @@ -99,6 +99,7 @@ void update_siblings_masks(unsigned int cpu);
> void remove_cpu_topology(unsigned int cpuid);
> void reset_cpu_topology(void);
> int parse_acpi_topology(void);
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate);
> #endif
>
> #endif /* _LINUX_ARCH_TOPOLOGY_H_ */
> --
> 2.34.1
>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Ionela Voinescu <ionela.voinescu@arm.com>
To: Vincent Guittot <vincent.guittot@linaro.org>
Cc: linux@armlinux.org.uk, catalin.marinas@arm.com, will@kernel.org,
paul.walmsley@sifive.com, palmer@dabbelt.com,
aou@eecs.berkeley.edu, sudeep.holla@arm.com,
gregkh@linuxfoundation.org, rafael@kernel.org, mingo@redhat.com,
peterz@infradead.org, juri.lelli@redhat.com,
dietmar.eggemann@arm.com, rostedt@goodmis.org,
bsegall@google.com, mgorman@suse.de, bristot@redhat.com,
vschneid@redhat.com, viresh.kumar@linaro.org, lenb@kernel.org,
robert.moore@intel.com, lukasz.luba@arm.com,
pierre.gondois@arm.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org,
linux-pm@vger.kernel.org, linux-acpi@vger.kernel.org,
acpica-devel@lists.linuxfoundation.org,
conor.dooley@microchip.com, suagrfillet@gmail.com,
ajones@ventanamicro.com, lftan@kernel.org
Subject: Re: [RFC v3 6/6] arm64/amu: use capacity_ref_freq to set AMU ratio
Date: Mon, 23 Oct 2023 21:58:32 +0100 [thread overview]
Message-ID: <ZTbebQrK3K+JwWxR@arm.com> (raw)
In-Reply-To: <20231018162540.667646-7-vincent.guittot@linaro.org>
Hi,
On Wednesday 18 Oct 2023 at 18:25:40 (+0200), Vincent Guittot wrote:
> Use the new capacity_ref_freq to set the ratio that is used by AMU for
> computing the arch_scale_freq_capacity().
> This helps to keep everything aligned using the same reference for
> computing CPUs capacity.
>
> The default value of the ratio ensures that arch_scale_freq_capacity()
> returns max capacity until it is set to its correct value with the
> cpu capacity and capacity_ref_freq.
>
> Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
> ---
> arch/arm64/kernel/topology.c | 18 ++++++++++--------
> drivers/base/arch_topology.c | 14 ++++++++++++--
> include/linux/arch_topology.h | 1 +
> 3 files changed, 23 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
> index 817d788cd866..0f8f6e90c46d 100644
> --- a/arch/arm64/kernel/topology.c
> +++ b/arch/arm64/kernel/topology.c
> @@ -82,7 +82,12 @@ int __init parse_acpi_topology(void)
> #undef pr_fmt
> #define pr_fmt(fmt) "AMU: " fmt
>
> -static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale);
> +/*
> + * Ensure that amu_scale_freq_tick() will return SCHED_CAPACITY_SHIFT until
> + * the CPU capacity and its assosciated frequency have been correctly
> + * initialized.
s/SCHED_CAPACITY_SHIFT/SCHED_CAPACITY_SCALE
> + */
> +static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale) = (2 * SCHED_CAPACITY_SHIFT);
It should be 1UL << (2 * SCHED_CAPACITY_SHIFT).
> static DEFINE_PER_CPU(u64, arch_const_cycles_prev);
> static DEFINE_PER_CPU(u64, arch_core_cycles_prev);
> static cpumask_var_t amu_fie_cpus;
> @@ -112,9 +117,9 @@ static inline bool freq_counters_valid(int cpu)
> return true;
> }
>
> -static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate)
> {
> - u64 ratio;
> + u64 ratio, ref_rate = arch_timer_get_rate();
>
> if (unlikely(!max_rate || !ref_rate)) {
> pr_debug("CPU%d: invalid maximum or reference frequency.\n",
> @@ -142,7 +147,7 @@ static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> return -EINVAL;
> }
The return value is no longer used so it might be worth declaring it to
return void and WARN_ONCE for unlikely(!max_rate || !ref_rate).
>
> - per_cpu(arch_max_freq_scale, cpu) = (unsigned long)ratio;
> + WRITE_ONCE(per_cpu(arch_max_freq_scale, cpu), (unsigned long)ratio);
>
> return 0;
> }
> @@ -195,10 +200,7 @@ static void amu_fie_setup(const struct cpumask *cpus)
> return;
>
> for_each_cpu(cpu, cpus) {
> - if (!freq_counters_valid(cpu) ||
> - freq_inv_set_max_ratio(cpu,
> - cpufreq_get_hw_max_freq(cpu) * 1000ULL,
> - arch_timer_get_rate()))
> + if (!freq_counters_valid(cpu))
> return;
> }
>
> diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
> index 2372ce791bb4..3a604b77b12d 100644
> --- a/drivers/base/arch_topology.c
> +++ b/drivers/base/arch_topology.c
> @@ -344,6 +344,11 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
> return !ret;
> }
>
> +int __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
> +{
> + return 0;
> +}
> +
> #ifdef CONFIG_ACPI_CPPC_LIB
> #include <acpi/cppc_acpi.h>
>
> @@ -369,7 +374,6 @@ void topology_init_cpu_capacity_cppc(void)
> capacity_scale = max_t(u64, capacity_scale, raw_capacity[cpu]);
>
> per_cpu(capacity_ref_freq, cpu) = cppc_perf_to_khz(&perf_caps, raw_capacity[cpu]);
> -
> pr_debug("cpu_capacity: CPU%d cpu_capacity=%u (raw).\n",
> cpu, raw_capacity[cpu]);
> continue;
> @@ -381,6 +385,9 @@ void topology_init_cpu_capacity_cppc(void)
> }
>
> for_each_possible_cpu(cpu) {
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
> +
> capacity = raw_capacity[cpu];
> capacity = div64_u64(capacity << SCHED_CAPACITY_SHIFT,
> capacity_scale);
> @@ -422,8 +429,11 @@ init_cpu_capacity_callback(struct notifier_block *nb,
>
> cpumask_andnot(cpus_to_visit, cpus_to_visit, policy->related_cpus);
>
> - for_each_cpu(cpu, policy->related_cpus)
> + for_each_cpu(cpu, policy->related_cpus) {
> per_cpu(capacity_ref_freq, cpu) = policy->cpuinfo.max_freq;
> + freq_inv_set_max_ratio(cpu,
> + per_cpu(capacity_ref_freq, cpu));
capacity_ref_freq is in KHz while arch_timer_get_rate() is in Hz. One or
the other needs to be scaled.
The same in topology_init_cpu_capacity_cppc().
Thanks,
Ionela.
> + }
>
> if (cpumask_empty(cpus_to_visit)) {
> topology_normalize_cpu_scale();
> diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
> index 38ca6c76af56..b6e95d763279 100644
> --- a/include/linux/arch_topology.h
> +++ b/include/linux/arch_topology.h
> @@ -99,6 +99,7 @@ void update_siblings_masks(unsigned int cpu);
> void remove_cpu_topology(unsigned int cpuid);
> void reset_cpu_topology(void);
> int parse_acpi_topology(void);
> +int freq_inv_set_max_ratio(int cpu, u64 max_rate);
> #endif
>
> #endif /* _LINUX_ARCH_TOPOLOGY_H_ */
> --
> 2.34.1
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-10-23 20:58 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-18 16:25 [PATCH v3 0/6] consolidate and cleanup CPU capacity Vincent Guittot
2023-10-18 16:25 ` [Acpica-devel] " Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` [PATCH v3 1/6] topology: add a new arch_scale_freq_reference Vincent Guittot
2023-10-18 16:25 ` [Acpica-devel] " Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` [PATCH v3 2/6] cpufreq: use the fixed and coherent frequency for scaling capacity Vincent Guittot
2023-10-18 16:25 ` [Acpica-devel] " Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 17:23 ` Rafael J. Wysocki
2023-10-18 17:23 ` [Acpica-devel] " Rafael J. Wysocki
2023-10-18 17:23 ` Rafael J. Wysocki
2023-10-18 17:23 ` Rafael J. Wysocki
2023-10-18 16:25 ` [PATCH v3 3/6] cpufreq/schedutil: use a fixed reference frequency Vincent Guittot
2023-10-18 16:25 ` [Acpica-devel] " Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 17:22 ` Rafael J. Wysocki
2023-10-18 17:22 ` [Acpica-devel] " Rafael J. Wysocki
2023-10-18 17:22 ` Rafael J. Wysocki
2023-10-18 17:22 ` Rafael J. Wysocki
2023-10-25 11:53 ` [Acpica-devel] " Peter Zijlstra
2023-10-25 11:53 ` Peter Zijlstra
2023-10-25 11:53 ` Peter Zijlstra
2023-10-25 11:53 ` Peter Zijlstra
2023-10-25 12:51 ` [Acpica-devel] " Vincent Guittot
2023-10-25 12:51 ` Vincent Guittot
2023-10-25 12:51 ` Vincent Guittot
2023-10-25 12:51 ` Vincent Guittot
2023-10-25 20:13 ` [Acpica-devel] " Dietmar Eggemann
2023-10-25 20:13 ` Dietmar Eggemann
2023-10-25 20:13 ` Dietmar Eggemann
2023-10-25 20:13 ` Dietmar Eggemann
2023-10-26 15:13 ` [Acpica-devel] " Vincent Guittot
2023-10-26 15:13 ` Vincent Guittot
2023-10-26 15:13 ` Vincent Guittot
2023-10-26 15:13 ` Vincent Guittot
2023-10-18 16:25 ` [PATCH v3 4/6] energy_model: " Vincent Guittot
2023-10-18 16:25 ` [Acpica-devel] " Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-25 11:54 ` [Acpica-devel] " Peter Zijlstra
2023-10-25 11:54 ` Peter Zijlstra
2023-10-25 11:54 ` Peter Zijlstra
2023-10-25 11:54 ` Peter Zijlstra
2023-10-25 12:11 ` [Acpica-devel] " Peter Zijlstra
2023-10-25 12:11 ` Peter Zijlstra
2023-10-25 12:11 ` Peter Zijlstra
2023-10-25 12:11 ` Peter Zijlstra
2023-10-25 12:24 ` [Acpica-devel] " Rafael J. Wysocki
2023-10-25 12:24 ` Rafael J. Wysocki
2023-10-25 12:24 ` Rafael J. Wysocki
2023-10-25 12:24 ` Rafael J. Wysocki
2023-10-25 12:54 ` [Acpica-devel] " Vincent Guittot
2023-10-25 12:54 ` Vincent Guittot
2023-10-25 12:54 ` Vincent Guittot
2023-10-25 12:54 ` Vincent Guittot
2023-10-18 16:25 ` [PATCH v3 5/6] cpufreq/cppc: set the frequency used for computing the capacity Vincent Guittot
2023-10-18 16:25 ` [Acpica-devel] " Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 17:26 ` Rafael J. Wysocki
2023-10-18 17:27 ` [Acpica-devel] " Rafael J. Wysocki
2023-10-18 17:26 ` Rafael J. Wysocki
2023-10-18 17:26 ` Rafael J. Wysocki
2023-10-20 16:05 ` [Acpica-devel] " Pierre Gondois
2023-10-20 16:05 ` Pierre Gondois
2023-10-20 16:05 ` Pierre Gondois
2023-10-20 16:05 ` Pierre Gondois
2023-10-24 9:56 ` [Acpica-devel] " Vincent Guittot
2023-10-24 9:56 ` Vincent Guittot
2023-10-24 9:56 ` Vincent Guittot
2023-10-24 9:56 ` Vincent Guittot
2023-10-25 12:24 ` Peter Zijlstra
2023-10-25 12:24 ` Peter Zijlstra
2023-10-25 12:24 ` Peter Zijlstra
2023-10-25 12:51 ` Peter Zijlstra
2023-10-25 12:51 ` Peter Zijlstra
2023-10-25 12:51 ` Peter Zijlstra
2023-10-25 12:58 ` Vincent Guittot
2023-10-25 12:58 ` Vincent Guittot
2023-10-25 12:58 ` Vincent Guittot
2023-10-18 16:25 ` [RFC v3 6/6] arm64/amu: use capacity_ref_freq to set AMU ratio Vincent Guittot
2023-10-18 16:25 ` [Acpica-devel] " Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-18 16:25 ` Vincent Guittot
2023-10-23 20:58 ` Ionela Voinescu [this message]
2023-10-23 20:58 ` Ionela Voinescu
2023-10-23 20:58 ` Ionela Voinescu
2023-10-23 20:58 ` Ionela Voinescu
2023-10-24 9:58 ` [Acpica-devel] " Vincent Guittot
2023-10-24 9:58 ` Vincent Guittot
2023-10-24 9:58 ` Vincent Guittot
2023-10-24 9:58 ` Vincent Guittot
2023-10-26 11:19 ` [Acpica-devel] " Dietmar Eggemann
2023-10-26 11:19 ` Dietmar Eggemann
2023-10-26 11:19 ` Dietmar Eggemann
2023-10-26 11:19 ` Dietmar Eggemann
2023-10-26 14:30 ` [Acpica-devel] " Vincent Guittot
2023-10-26 14:30 ` Vincent Guittot
2023-10-26 14:30 ` Vincent Guittot
2023-10-26 14:30 ` Vincent Guittot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZTbebQrK3K+JwWxR@arm.com \
--to=ionela.voinescu@arm.com \
--cc=acpica-devel@lists.linuxfoundation.org \
--cc=ajones@ventanamicro.com \
--cc=aou@eecs.berkeley.edu \
--cc=bristot@redhat.com \
--cc=bsegall@google.com \
--cc=catalin.marinas@arm.com \
--cc=conor.dooley@microchip.com \
--cc=dietmar.eggemann@arm.com \
--cc=gregkh@linuxfoundation.org \
--cc=juri.lelli@redhat.com \
--cc=lenb@kernel.org \
--cc=lftan@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux@armlinux.org.uk \
--cc=lukasz.luba@arm.com \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=peterz@infradead.org \
--cc=pierre.gondois@arm.com \
--cc=robert.moore@intel.com \
--cc=rostedt@goodmis.org \
--cc=suagrfillet@gmail.com \
--cc=sudeep.holla@arm.com \
--cc=vincent.guittot@linaro.org \
--cc=viresh.kumar@linaro.org \
--cc=vschneid@redhat.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.