Skip to content

Commit 38e480d

Browse files
bea-armctmarinas
authored andcommitted
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>
1 parent 004b500 commit 38e480d

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
@@ -729,18 +729,18 @@ show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
729729
show_one(scaling_min_freq, min);
730730
show_one(scaling_max_freq, max);
731731

732-
__weak unsigned int arch_freq_get_on_cpu(int cpu)
732+
__weak int arch_freq_get_on_cpu(int cpu)
733733
{
734-
return 0;
734+
return -EOPNOTSUPP;
735735
}
736736

737737
static ssize_t show_scaling_cur_freq(struct cpufreq_policy *policy, char *buf)
738738
{
739739
ssize_t ret;
740-
unsigned int freq;
740+
int freq;
741741

742742
freq = arch_freq_get_on_cpu(policy->cpu);
743-
if (freq)
743+
if (freq > 0)
744744
ret = sysfs_emit(buf, "%u\n", freq);
745745
else if (cpufreq_driver->setpolicy && cpufreq_driver->get)
746746
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)