• Rafael J. Wysocki's avatar
    cpufreq: x86: Make scaling_cur_freq behave more as expected · 4815d3c5
    Rafael J. Wysocki authored
    After commit f8475cef "x86: use common aperfmperf_khz_on_cpu() to
    calculate KHz using APERF/MPERF" the scaling_cur_freq policy attribute
    in sysfs only behaves as expected on x86 with APERF/MPERF registers
    available when it is read from at least twice in a row.  The value
    returned by the first read may not be meaningful, because the
    computations in there use cached values from the previous iteration
    of aperfmperf_snapshot_khz() which may be stale.
    
    To prevent that from happening, modify arch_freq_get_on_cpu() to
    call aperfmperf_snapshot_khz() twice, with a short delay between
    these calls, if the previous invocation of aperfmperf_snapshot_khz()
    was too far back in the past (specifically, more that 1s ago).
    
    Also, as pointed out by Doug Smythies, aperf_delta is limited now
    and the multiplication of it by cpu_khz won't overflow, so simplify
    the s->khz computations too.
    
    Fixes: f8475cef "x86: use common aperfmperf_khz_on_cpu() to calculate KHz using APERF/MPERF"
    Reported-by: default avatarDoug Smythies <dsmythies@telus.net>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    4815d3c5
aperfmperf.c 2.02 KB