Skip to content

Commit 2a41628

Browse files
author
Jennifer Berringer
committed
cpufreq: Allow arch_freq_get_on_cpu to return an error
JIRA: https://issues.redhat.com/browse/RHEL-80968 commit 38e480d Author: Beata Michalska <beata.michalska@arm.com> Date: Fri Jan 31 16:24:36 2025 +0000 cpufreq: Allow arch_freq_get_on_cpu to return an error Allow arch_freq_get_on_cpu to return an error for cases when retrieving current CPU frequency is not possible, whether that being due to lack of required arch support or due to other circumstances when the current frequency cannot be determined at given point of time. Signed-off-by: Beata Michalska <beata.michalska@arm.com> Reviewed-by: Prasanna Kumar T S M <ptsm@linux.microsoft.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Acked-by: Rafael J. Wysocki <rafael@kernel.org> Link: https://lore.kernel.org/r/20250131162439.3843071-2-beata.michalska@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Jennifer Berringer <jberring@redhat.com>
1 parent 3679add commit 2a41628

File tree

4 files changed

+11
-8
lines changed

4 files changed

+11
-8
lines changed

arch/x86/kernel/cpu/aperfmperf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ void arch_scale_freq_tick(void)
498498
*/
499499
#define MAX_SAMPLE_AGE ((unsigned long)HZ / 50)
500500

501-
unsigned int arch_freq_get_on_cpu(int cpu)
501+
int arch_freq_get_on_cpu(int cpu)
502502
{
503503
struct aperfmperf *s = per_cpu_ptr(&cpu_samples, cpu);
504504
unsigned int seq, freq;

arch/x86/kernel/cpu/proc.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,12 @@ static int show_cpuinfo(struct seq_file *m, void *v)
8686
seq_printf(m, "microcode\t: 0x%x\n", c->microcode);
8787

8888
if (cpu_has(c, X86_FEATURE_TSC)) {
89-
unsigned int freq = arch_freq_get_on_cpu(cpu);
89+
int freq = arch_freq_get_on_cpu(cpu);
9090

91-
seq_printf(m, "cpu MHz\t\t: %u.%03u\n", freq / 1000, (freq % 1000));
91+
if (freq < 0)
92+
seq_puts(m, "cpu MHz\t\t: Unknown\n");
93+
else
94+
seq_printf(m, "cpu MHz\t\t: %u.%03u\n", freq / 1000, (freq % 1000));
9295
}
9396

9497
/* Cache size */

drivers/cpufreq/cpufreq.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -728,18 +728,18 @@ show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
728728
show_one(scaling_min_freq, min);
729729
show_one(scaling_max_freq, max);
730730

731-
__weak unsigned int arch_freq_get_on_cpu(int cpu)
731+
__weak int arch_freq_get_on_cpu(int cpu)
732732
{
733-
return 0;
733+
return -EOPNOTSUPP;
734734
}
735735

736736
static ssize_t show_scaling_cur_freq(struct cpufreq_policy *policy, char *buf)
737737
{
738738
ssize_t ret;
739-
unsigned int freq;
739+
int freq;
740740

741741
freq = arch_freq_get_on_cpu(policy->cpu);
742-
if (freq)
742+
if (freq > 0)
743743
ret = sysfs_emit(buf, "%u\n", freq);
744744
else if (cpufreq_driver->setpolicy && cpufreq_driver->get)
745745
ret = sysfs_emit(buf, "%u\n", cpufreq_driver->get(policy->cpu));

include/linux/cpufreq.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,7 @@ static inline int of_perf_domain_get_sharing_cpumask(int pcpu, const char *list_
11841184
}
11851185
#endif
11861186

1187-
extern unsigned int arch_freq_get_on_cpu(int cpu);
1187+
extern int arch_freq_get_on_cpu(int cpu);
11881188

11891189
#ifndef arch_set_freq_scale
11901190
static __always_inline

0 commit comments

Comments
 (0)