• Rafael J. Wysocki's avatar
    cpufreq: intel_pstate: One set of global limits in active mode · 7de32556
    Rafael J. Wysocki authored
    In the active mode intel_pstate currently uses two sets of global
    limits, each associated with one of the possible scaling_governor
    settings in that mode: "powersave" or "performance".
    
    The driver switches over from one of those sets to the other
    depending on the scaling_governor setting for the last CPU whose
    per-policy cpufreq interface in sysfs was last used to change
    parameters exposed in there.  That obviously leads to no end of
    issues when the scaling_governor settings differ between CPUs.
    
    The most recent issue was introduced by commit a240c4aa (cpufreq:
    intel_pstate: Do not reinit performance limits in ->setpolicy)
    that eliminated the reinitialization of "performance" limits in
    intel_pstate_set_policy() preventing the max limit from being set
    to anything below 100, among other things.
    
    Namely, an undesirable side effect of commit a240c4aa is that
    now, after setting scaling_governor to "performance" in the active
    mode, the per-policy limits for the CPU in question go to the highest
    level and stay there even when it is switched back to "powersave"
    later.
    
    As it turns out, some distributions set scaling_governor to
    "performance" temporarily for all CPUs to speed-up system
    initialization, so that change causes them to misbehave later.
    
    To fix that, get rid of the performance/powersave global limits
    split and use just one set of global limits for everything.
    
    From the user's persepctive, after this modification, when
    scaling_governor is switched from "performance" to "powersave"
    or the other way around on one CPU, the limits settings (ie. the
    global max/min_perf_pct and per-policy scaling_max/min_freq for
    any CPUs) will not change.  Still, switching from "performance"
    to "powersave" or the other way around changes the way in which
    P-states are selected and in particular "performance" causes the
    driver to always request the highest P-state it is allowed to ask
    for for the given CPU.
    
    Fixes: a240c4aa (cpufreq: intel_pstate: Do not reinit performance limits in ->setpolicy)
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    7de32556
intel_pstate.c 68.1 KB