lkml.org 
[lkml]   [2017]   [Nov]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.13 31/36] x86: CPU: Fix up "cpu MHz" in /proc/cpuinfo
    Date
    4.13-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

    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).

    Fixes: 890da9cf0983 (Revert "x86: do not use cpufreq_quick_get() for /proc/cpuinfo "cpu MHz"")
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    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(-)

    --- a/arch/x86/kernel/cpu/Makefile
    +++ b/arch/x86/kernel/cpu/Makefile
    @@ -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
    --- a/arch/x86/kernel/cpu/aperfmperf.c
    +++ b/arch/x86/kernel/cpu/aperfmperf.c
    @@ -42,10 +42,6 @@ static void aperfmperf_snapshot_khz(void
    s64 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(void

    unsigned 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 cp
    if (!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)
    --- a/arch/x86/kernel/cpu/proc.c
    +++ b/arch/x86/kernel/cpu/proc.c
    @@ -77,9 +77,11 @@ static int show_cpuinfo(struct seq_file
    seq_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));

    \
     
     \ /
      Last update: 2017-11-06 10:21    [W:3.333 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site