• Len Brown's avatar
    x86: use common aperfmperf_khz_on_cpu() to calculate KHz using APERF/MPERF · f8475cef
    Len Brown authored
    The goal of this change is to give users a uniform and meaningful
    result when they read /sys/...cpufreq/scaling_cur_freq
    on modern x86 hardware, as compared to what they get today.
    
    Modern x86 processors include the hardware needed
    to accurately calculate frequency over an interval --
    APERF, MPERF, and the TSC.
    
    Here we provide an x86 routine to make this calculation
    on supported hardware, and use it in preference to any
    driver driver-specific cpufreq_driver.get() routine.
    
    MHz is computed like so:
    
    MHz = base_MHz * delta_APERF / delta_MPERF
    
    MHz is the average frequency of the busy processor
    over a measurement interval.  The interval is
    defined to be the time between successive invocations
    of aperfmperf_khz_on_cpu(), which are expected to to
    happen on-demand when users read sysfs attribute
    cpufreq/scaling_cur_freq.
    
    As with previous methods of calculating MHz,
    idle time is excluded.
    
    base_MHz above is from TSC calibration global "cpu_khz".
    
    This x86 native method to calculate MHz returns a meaningful result
    no matter if P-states are controlled by hardware or firmware
    and/or if the Linux cpufreq sub-system is or is-not installed.
    
    When this routine is invoked more frequently, the measurement
    interval becomes shorter.  However, the code limits re-computation
    to 10ms intervals so that average frequency remains meaningful.
    
    Discerning users are encouraged to take advantage of
    the turbostat(8) utility, which can gracefully handle
    concurrent measurement intervals of arbitrary length.
    Signed-off-by: default avatarLen Brown <len.brown@intel.com>
    Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    f8475cef
aperfmperf.c 1.77 KB