Patch "x86 / CPU: Avoid unnecessary IPIs in arch_freq_get_on_cpu()" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86 / CPU: Avoid unnecessary IPIs in arch_freq_get_on_cpu()
to the 4.14-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-avoid-unnecessary-ipis-in-arch_freq_get_on_cpu.patch
and it can be found in the queue-4.14 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
b29c6ef7bb1257853c1e31616d84f55e561cf631Mon Sep 17 00:00:00 2001
From: "Rafael J. Wysocki" <[email protected]>
Date: Mon, 13 Nov 2017 02:15:39 +0100
Subject: x86 / CPU: Avoid unnecessary IPIs in arch_freq_get_on_cpu()
From: Rafael J. Wysocki <[email protected]>
commit b29c6ef7bb1257853c1e31616d84f55e561cf631 upstream.
Even though aperfmperf_snapshot_khz() caches the samples.khz value to return if called again in a sufficiently short time, its caller, arch_freq_get_on_cpu(), still uses smp_call_function_single() to run it which may allow user space to trigger an IPI storm by reading from the scaling_cur_freq cpufreq sysfs file in a tight loop.
To avoid that, move the decision on whether or not to return the cached samples.khz value to arch_freq_get_on_cpu().
This change was part of commit 941f5f0f6ef5 ("x86: CPU: Fix up "cpu MHz" in /proc/cpuinfo"), but it was not the reason for the revert and it remains applicable.
--- arch/x86/kernel/cpu/aperfmperf.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
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)
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/x86-cpu-always-show-current-cpu-frequency-in-proc-cpuinfo.patch queue-4.14/x86-cpu-avoid-unnecessary-ipis-in-arch_freq_get_on_cpu.patch