7d84c1ebf9
The frequency invariance infrastructure provides the APERF/MPERF samples already. Utilize them for the cpu frequency display in /proc/cpuinfo. The sample is considered valid for 20ms. So for idle or isolated NOHZ full CPUs the function returns 0, which is matching the previous behaviour. This gets rid of the mass IPIs and a delay of 20ms for stabilizing observed by Eric when reading /proc/cpuinfo. Reported-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Paul E. McKenney <paulmck@kernel.org> Link: https://lore.kernel.org/r/20220415161206.875029458@linutronix.de
29 lines
670 B
C
29 lines
670 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/cpufreq.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/init.h>
|
|
#include <linux/proc_fs.h>
|
|
#include <linux/seq_file.h>
|
|
|
|
extern const struct seq_operations cpuinfo_op;
|
|
|
|
static int cpuinfo_open(struct inode *inode, struct file *file)
|
|
{
|
|
return seq_open(file, &cpuinfo_op);
|
|
}
|
|
|
|
static const struct proc_ops cpuinfo_proc_ops = {
|
|
.proc_flags = PROC_ENTRY_PERMANENT,
|
|
.proc_open = cpuinfo_open,
|
|
.proc_read_iter = seq_read_iter,
|
|
.proc_lseek = seq_lseek,
|
|
.proc_release = seq_release,
|
|
};
|
|
|
|
static int __init proc_cpuinfo_init(void)
|
|
{
|
|
proc_create("cpuinfo", 0, NULL, &cpuinfo_proc_ops);
|
|
return 0;
|
|
}
|
|
fs_initcall(proc_cpuinfo_init);
|