All of lore.kernel.org
 help / color / mirror / Atom feed
From: Beata Michalska <beata.michalska@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,
	ionela.voinescu@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,
	conor.dooley@microchip.com, suagrfillet@gmail.com,
	ajones@ventanamicro.com, lftan@kernel.org
Subject: Re: [PATCH v6 7/7] arm64/amu: Use capacity_ref_freq to set AMU ratio
Date: Wed, 15 Nov 2023 10:42:08 +0100	[thread overview]
Message-ID: <ZVSSSi8sGSI8IREe@e129154.nice.arm.com> (raw)
In-Reply-To: <ZVNw5Ci9kCPMqV67@e129154.nice.arm.com>

On Tue, Nov 14, 2023 at 02:07:01PM +0100, Beata Michalska wrote:
> On Thu, Nov 09, 2023 at 11:14:38AM +0100, 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 (stored in per_cpu(arch_max_freq_scale))
> > 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>
> > Acked-by: Sudeep Holla <sudeep.holla@arm.com>
> > ---
> >  arch/arm64/kernel/topology.c  | 26 +++++++++++++-------------
> >  drivers/base/arch_topology.c  | 12 +++++++++++-
> >  include/linux/arch_topology.h |  1 +
> >  3 files changed, 25 insertions(+), 14 deletions(-)
> > 
> > diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
> > index 817d788cd866..1a2c72f3e7f8 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_SCALE until
> > + * the CPU capacity and its associated frequency have been correctly
> > + * initialized.
> > + */
> > +static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale) =  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,14 +117,14 @@ 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)
> > +void 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",
> > +		WARN_ONCE(1, "CPU%d: invalid maximum or reference frequency.\n",
> >  			 cpu);
> > -		return -EINVAL;
> > +		return;
> >  	}
> >  
> >  	/*
> > @@ -139,12 +144,10 @@ static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> >  	ratio = div64_u64(ratio, max_rate);
> >  	if (!ratio) {
> >  		WARN_ONCE(1, "Reference frequency too low.\n");
> > -		return -EINVAL;
> > +		return;
> >  	}
> >  
> > -	per_cpu(arch_max_freq_scale, cpu) = (unsigned long)ratio;
> > -
> > -	return 0;
> > +	WRITE_ONCE(per_cpu(arch_max_freq_scale, cpu), (unsigned long)ratio);
> >  }
> >  
> >  static void amu_scale_freq_tick(void)
> > @@ -195,10 +198,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 0a2e43728286..0906114963ff 100644
> > --- a/drivers/base/arch_topology.c
> > +++ b/drivers/base/arch_topology.c
> > @@ -344,6 +344,10 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
> >  	return !ret;
> >  }
> >  
> > +void __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
> > +{
> > +}
> > +
> >  #ifdef CONFIG_ACPI_CPPC_LIB
> >  #include <acpi/cppc_acpi.h>
> >  
> > @@ -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_freq_ref, cpu) * HZ_PER_KHZ);
> > +
> >  		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_freq_ref, cpu) = policy->cpuinfo.max_freq;
> > +		freq_inv_set_max_ratio(cpu,
> > +				       per_cpu(capacity_freq_ref, cpu) * HZ_PER_KHZ);
> > +	}
> Just wondering if this is really necessary as freq_inv_set_max_ratio will
> originally be called upon cpufreq notification being triggered (with
> CPUFREQ_CREATE_POLICY event) which should happen after the newly introduced
> capacity_freq_ref gets properly set up, so wouldn't the change of flipping
> cpufreq_get_hw_max_freq(cpu) to capacity_freq_ref do just fine ?
> Then pushing AMU specific call to generic arch code  would not be necessary.
> Or did I miss smth on the way ?
> 
I guess you can ignore my comment as init_cpu_capacity_callback (where we now
set the capacity_freq_ref) works on the same basis so there is no guarantee it
will be triggered before AMU callback.
Still having the freq_inv_set_max_ratio sitting in arch_topology.c somehow
doesn't sit well with me. We could potentially check capacity_freq_ref against
its init value and act accordingly but that is gruesome as well.

> ---
> BR
> B.
> 
> >  
> >  	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 32c24ff4f2a8..a63d61ca55af 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);
> > +void 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: Beata Michalska <beata.michalska@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,
	ionela.voinescu@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,
	conor.dooley@microchip.com, suagrfillet@gmail.com,
	ajones@ventanamicro.com, lftan@kernel.org
Subject: Re: [PATCH v6 7/7] arm64/amu: Use capacity_ref_freq to set AMU ratio
Date: Wed, 15 Nov 2023 10:42:08 +0100	[thread overview]
Message-ID: <ZVSSSi8sGSI8IREe@e129154.nice.arm.com> (raw)
In-Reply-To: <ZVNw5Ci9kCPMqV67@e129154.nice.arm.com>

On Tue, Nov 14, 2023 at 02:07:01PM +0100, Beata Michalska wrote:
> On Thu, Nov 09, 2023 at 11:14:38AM +0100, 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 (stored in per_cpu(arch_max_freq_scale))
> > 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>
> > Acked-by: Sudeep Holla <sudeep.holla@arm.com>
> > ---
> >  arch/arm64/kernel/topology.c  | 26 +++++++++++++-------------
> >  drivers/base/arch_topology.c  | 12 +++++++++++-
> >  include/linux/arch_topology.h |  1 +
> >  3 files changed, 25 insertions(+), 14 deletions(-)
> > 
> > diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
> > index 817d788cd866..1a2c72f3e7f8 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_SCALE until
> > + * the CPU capacity and its associated frequency have been correctly
> > + * initialized.
> > + */
> > +static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale) =  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,14 +117,14 @@ 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)
> > +void 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",
> > +		WARN_ONCE(1, "CPU%d: invalid maximum or reference frequency.\n",
> >  			 cpu);
> > -		return -EINVAL;
> > +		return;
> >  	}
> >  
> >  	/*
> > @@ -139,12 +144,10 @@ static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> >  	ratio = div64_u64(ratio, max_rate);
> >  	if (!ratio) {
> >  		WARN_ONCE(1, "Reference frequency too low.\n");
> > -		return -EINVAL;
> > +		return;
> >  	}
> >  
> > -	per_cpu(arch_max_freq_scale, cpu) = (unsigned long)ratio;
> > -
> > -	return 0;
> > +	WRITE_ONCE(per_cpu(arch_max_freq_scale, cpu), (unsigned long)ratio);
> >  }
> >  
> >  static void amu_scale_freq_tick(void)
> > @@ -195,10 +198,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 0a2e43728286..0906114963ff 100644
> > --- a/drivers/base/arch_topology.c
> > +++ b/drivers/base/arch_topology.c
> > @@ -344,6 +344,10 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
> >  	return !ret;
> >  }
> >  
> > +void __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
> > +{
> > +}
> > +
> >  #ifdef CONFIG_ACPI_CPPC_LIB
> >  #include <acpi/cppc_acpi.h>
> >  
> > @@ -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_freq_ref, cpu) * HZ_PER_KHZ);
> > +
> >  		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_freq_ref, cpu) = policy->cpuinfo.max_freq;
> > +		freq_inv_set_max_ratio(cpu,
> > +				       per_cpu(capacity_freq_ref, cpu) * HZ_PER_KHZ);
> > +	}
> Just wondering if this is really necessary as freq_inv_set_max_ratio will
> originally be called upon cpufreq notification being triggered (with
> CPUFREQ_CREATE_POLICY event) which should happen after the newly introduced
> capacity_freq_ref gets properly set up, so wouldn't the change of flipping
> cpufreq_get_hw_max_freq(cpu) to capacity_freq_ref do just fine ?
> Then pushing AMU specific call to generic arch code  would not be necessary.
> Or did I miss smth on the way ?
> 
I guess you can ignore my comment as init_cpu_capacity_callback (where we now
set the capacity_freq_ref) works on the same basis so there is no guarantee it
will be triggered before AMU callback.
Still having the freq_inv_set_max_ratio sitting in arch_topology.c somehow
doesn't sit well with me. We could potentially check capacity_freq_ref against
its init value and act accordingly but that is gruesome as well.

> ---
> BR
> B.
> 
> >  
> >  	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 32c24ff4f2a8..a63d61ca55af 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);
> > +void 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: Beata Michalska <beata.michalska@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,
	ionela.voinescu@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,
	conor.dooley@microchip.com, suagrfillet@gmail.com,
	ajones@ventanamicro.com, lftan@kernel.org
Subject: Re: [PATCH v6 7/7] arm64/amu: Use capacity_ref_freq to set AMU ratio
Date: Wed, 15 Nov 2023 10:42:08 +0100	[thread overview]
Message-ID: <ZVSSSi8sGSI8IREe@e129154.nice.arm.com> (raw)
In-Reply-To: <ZVNw5Ci9kCPMqV67@e129154.nice.arm.com>

On Tue, Nov 14, 2023 at 02:07:01PM +0100, Beata Michalska wrote:
> On Thu, Nov 09, 2023 at 11:14:38AM +0100, 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 (stored in per_cpu(arch_max_freq_scale))
> > 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>
> > Acked-by: Sudeep Holla <sudeep.holla@arm.com>
> > ---
> >  arch/arm64/kernel/topology.c  | 26 +++++++++++++-------------
> >  drivers/base/arch_topology.c  | 12 +++++++++++-
> >  include/linux/arch_topology.h |  1 +
> >  3 files changed, 25 insertions(+), 14 deletions(-)
> > 
> > diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c
> > index 817d788cd866..1a2c72f3e7f8 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_SCALE until
> > + * the CPU capacity and its associated frequency have been correctly
> > + * initialized.
> > + */
> > +static DEFINE_PER_CPU_READ_MOSTLY(unsigned long, arch_max_freq_scale) =  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,14 +117,14 @@ 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)
> > +void 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",
> > +		WARN_ONCE(1, "CPU%d: invalid maximum or reference frequency.\n",
> >  			 cpu);
> > -		return -EINVAL;
> > +		return;
> >  	}
> >  
> >  	/*
> > @@ -139,12 +144,10 @@ static int freq_inv_set_max_ratio(int cpu, u64 max_rate, u64 ref_rate)
> >  	ratio = div64_u64(ratio, max_rate);
> >  	if (!ratio) {
> >  		WARN_ONCE(1, "Reference frequency too low.\n");
> > -		return -EINVAL;
> > +		return;
> >  	}
> >  
> > -	per_cpu(arch_max_freq_scale, cpu) = (unsigned long)ratio;
> > -
> > -	return 0;
> > +	WRITE_ONCE(per_cpu(arch_max_freq_scale, cpu), (unsigned long)ratio);
> >  }
> >  
> >  static void amu_scale_freq_tick(void)
> > @@ -195,10 +198,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 0a2e43728286..0906114963ff 100644
> > --- a/drivers/base/arch_topology.c
> > +++ b/drivers/base/arch_topology.c
> > @@ -344,6 +344,10 @@ bool __init topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu)
> >  	return !ret;
> >  }
> >  
> > +void __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
> > +{
> > +}
> > +
> >  #ifdef CONFIG_ACPI_CPPC_LIB
> >  #include <acpi/cppc_acpi.h>
> >  
> > @@ -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_freq_ref, cpu) * HZ_PER_KHZ);
> > +
> >  		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_freq_ref, cpu) = policy->cpuinfo.max_freq;
> > +		freq_inv_set_max_ratio(cpu,
> > +				       per_cpu(capacity_freq_ref, cpu) * HZ_PER_KHZ);
> > +	}
> Just wondering if this is really necessary as freq_inv_set_max_ratio will
> originally be called upon cpufreq notification being triggered (with
> CPUFREQ_CREATE_POLICY event) which should happen after the newly introduced
> capacity_freq_ref gets properly set up, so wouldn't the change of flipping
> cpufreq_get_hw_max_freq(cpu) to capacity_freq_ref do just fine ?
> Then pushing AMU specific call to generic arch code  would not be necessary.
> Or did I miss smth on the way ?
> 
I guess you can ignore my comment as init_cpu_capacity_callback (where we now
set the capacity_freq_ref) works on the same basis so there is no guarantee it
will be triggered before AMU callback.
Still having the freq_inv_set_max_ratio sitting in arch_topology.c somehow
doesn't sit well with me. We could potentially check capacity_freq_ref against
its init value and act accordingly but that is gruesome as well.

> ---
> BR
> B.
> 
> >  
> >  	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 32c24ff4f2a8..a63d61ca55af 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);
> > +void 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

  reply	other threads:[~2023-11-15  9:43 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-09 10:14 [PATCH v6 0/7] consolidate and cleanup CPU capacity Vincent Guittot
2023-11-09 10:14 ` Vincent Guittot
2023-11-09 10:14 ` Vincent Guittot
2023-11-09 10:14 ` [PATCH v6 1/7] topology: Add a new arch_scale_freq_reference Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-28 15:52   ` Ionela Voinescu
2023-11-28 15:52     ` Ionela Voinescu
2023-11-28 15:52     ` Ionela Voinescu
2023-11-28 16:00     ` Ionela Voinescu
2023-11-28 16:00       ` Ionela Voinescu
2023-11-28 16:00       ` Ionela Voinescu
2023-11-29 14:57       ` Vincent Guittot
2023-11-29 14:57         ` Vincent Guittot
2023-11-29 14:57         ` Vincent Guittot
2023-11-09 10:14 ` [PATCH v6 2/7] cpufreq: Use the fixed and coherent frequency for scaling capacity Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14 ` [PATCH v6 3/7] cpufreq/schedutil: Use a fixed reference frequency Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-10  9:17   ` Viresh Kumar
2023-11-10  9:17     ` Viresh Kumar
2023-11-10  9:17     ` Viresh Kumar
2023-11-09 10:14 ` [PATCH v6 4/7] energy_model: " Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14 ` [PATCH v6 5/7] cpufreq/cppc: Move and rename cppc_cpufreq_{perf_to_khz|khz_to_perf} Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-10  9:17   ` Viresh Kumar
2023-11-10  9:17     ` Viresh Kumar
2023-11-10  9:17     ` Viresh Kumar
2023-11-09 10:14 ` [PATCH v6 6/7] cpufreq/cppc: Set the frequency used for computing the capacity Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-10  9:18   ` Viresh Kumar
2023-11-10  9:18     ` Viresh Kumar
2023-11-10  9:18     ` Viresh Kumar
2023-11-09 10:14 ` [PATCH v6 7/7] arm64/amu: Use capacity_ref_freq to set AMU ratio Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-09 10:14   ` Vincent Guittot
2023-11-14 13:06   ` Beata Michalska
2023-11-14 13:06     ` Beata Michalska
2023-11-14 13:06     ` Beata Michalska
2023-11-15  9:42     ` Beata Michalska [this message]
2023-11-15  9:42       ` Beata Michalska
2023-11-15  9:42       ` Beata Michalska
2023-11-21 15:43   ` Will Deacon
2023-11-21 15:43     ` Will Deacon
2023-11-21 15:43     ` Will Deacon
2023-11-10  8:30 ` [PATCH v6 0/7] consolidate and cleanup CPU capacity Pierre Gondois
2023-11-10  8:30   ` Pierre Gondois
2023-11-10  8:30   ` Pierre Gondois

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=ZVSSSi8sGSI8IREe@e129154.nice.arm.com \
    --to=beata.michalska@arm.com \
    --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=ionela.voinescu@arm.com \
    --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=rafael@kernel.org \
    --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.