Patch "x86: CPU: Fix up "cpu MHz" in /proc/cpuinfo" has been added to the 4.13-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86: CPU: Fix up "cpu MHz" in /proc/cpuinfo
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-cpu-fix-up-cpu-mhz-in-proc-cpuinfo.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
941f5f0f6ef5338814145cf2b813cf1f98873e2fMon Sep 17 00:00:00 2001
From: "Rafael J. Wysocki" <[email protected]>
Date: Fri, 3 Nov 2017 16:35:49 +0100
Subject: x86: CPU: Fix up "cpu MHz" in /proc/cpuinfo
From: Rafael J. Wysocki <[email protected]>
commit 941f5f0f6ef5338814145cf2b813cf1f98873e2f upstream.
Commit 890da9cf0983 (Revert "x86: do not use cpufreq_quick_get() for /proc/cpuinfo "cpu MHz"") is not sufficient to restore the previous behavior of "cpu MHz" in /proc/cpuinfo on x86 due to some changes made after the commit it has reverted.
To address this, make the code in question use arch_freq_get_on_cpu() which also is used by cpufreq for reporting the current frequency of CPUs and since that function doesn't really depend on cpufreq in any way, drop the CONFIG_CPU_FREQ dependency for the object file containing it.
Also refactor arch_freq_get_on_cpu() somewhat to avoid IPIs and return cached values right away if it is called very often over a short time (to prevent user space from triggering IPI storms through it).
--- arch/x86/kernel/cpu/Makefile | 2 +- arch/x86/kernel/cpu/aperfmperf.c | 11 +++++++---- arch/x86/kernel/cpu/proc.c | 4 +++- 3 files changed, 11 insertions(+), 6 deletions(-)
arch/x86/kernel/cpu/Makefile +1 -1
@@ -21,7 +21,7 @@ obj-y += common.o obj-y += rdrand.o obj-y += match.o obj-y += bugs.o -obj-$(CONFIG_CPU_FREQ) += aperfmperf.o +obj-y += aperfmperf.o obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_X86_FEATURE_NAMES) += capflags.o powerflags.o
arch/x86/kernel/cpu/aperfmperf.c +7 -4
@@ -42,10 +42,6 @@ static void aperfmperf_snapshot_khz(voids64 time_delta =ktime_ms_delta (now, s->time);unsigned long flags; -/* Don't bother re-computing within the cache threshold time. */ -if (time_delta <APERFMPERF_CACHE_THRESHOLD_MS ) -return ; -local_irq_save (flags);rdmsrl (MSR_IA32_APERF , aperf);rdmsrl (MSR_IA32_MPERF , mperf);
@@ -74,6 +70,7 @@ static void aperfmperf_snapshot_khz(voidunsigned int arch_freq_get_on_cpu (int cpu) { +s64 time_delta;unsigned int khz;if (!cpu_khz)
@@ -82,6 +79,12 @@ unsigned int arch_freq_get_on_cpu(int cpif (!static_cpu_has (X86_FEATURE_APERFMPERF ))return 0 ; +/* Don't bother re-computing within the cache threshold time. */ + time_delta =ktime_ms_delta (ktime_get (),per_cpu (samples.time, cpu)); + khz =per_cpu (samples.khz, cpu); +if (khz && time_delta <APERFMPERF_CACHE_THRESHOLD_MS ) +return khz; +smp_call_function_single (cpu, aperfmperf_snapshot_khz,NULL ,1 ); khz =per_cpu (samples.khz, cpu);if (khz)
arch/x86/kernel/cpu/proc.c +3 -1
@@ -77,9 +77,11 @@ static int show_cpuinfo(struct seq_fileseq_printf (m,"microcode\t: 0x%x\n" , c->microcode);if (cpu_has (c,X86_FEATURE_TSC )) { -unsigned int freq =cpufreq_quick_get (cpu); +unsigned int freq =arch_freq_get_on_cpu (cpu);if (!freq) + freq =cpufreq_quick_get (cpu); +if (!freq) freq = cpu_khz;seq_printf (m,"cpu MHz\t\t: %u.%03u\n" , freq /1000 , (freq %1000 ));
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/revert-x86-do-not-use-cpufreq_quick_get-for-proc-cpuinfo-cpu-mhz.patch queue-4.13/pm-qos-fix-default-runtime_pm-device-resume-latency.patch queue-4.13/x86-cpu-fix-up-cpu-mhz-in-proc-cpuinfo.patch queue-4.13/pm-qos-fix-device-resume-latency-pm-qos.patch