• Rafael J. Wysocki's avatar
    cpufreq: intel_pstate: Do not reinit performance limits in ->setpolicy · a240c4aa
    Rafael J. Wysocki authored
    If the current P-state selection algorithm is set to "performance"
    in intel_pstate_set_policy(), the limits may be initialized from
    scratch, but only if no_turbo is not set and the maximum frequency
    allowed for the given CPU (i.e. the policy object representing it)
    is at least equal to the max frequency supported by the CPU.  In all
    of the other cases, the limits will not be updated.
    
    For example, the following can happen:
    
     # cat intel_pstate/status
     active
     # echo performance > cpufreq/policy0/scaling_governor
     # cat intel_pstate/min_perf_pct
     100
     # echo 94 > intel_pstate/min_perf_pct
     # cat intel_pstate/min_perf_pct
     100
     # cat cpufreq/policy0/scaling_max_freq
     3100000
     echo 3000000 > cpufreq/policy0/scaling_max_freq
     # cat intel_pstate/min_perf_pct
     94
     # echo 95 > intel_pstate/min_perf_pct
     # cat intel_pstate/min_perf_pct
     95
    
    That is confusing for two reasons.  First, the initial attempt to
    change min_perf_pct to 94 seems to have no effect, even though
    setting the global limits should always work.  Second, after
    changing scaling_max_freq for policy0 the global min_perf_pct
    attribute shows 94, even though it should have not been affected
    by that operation in principle.
    
    Moreover, the final attempt to change min_perf_pct to 95 worked
    as expected, because scaling_max_freq for the only policy with
    scaling_governor equal to "performance" was different from the
    maximum at that time.
    
    To make all that confusion go away, modify intel_pstate_set_policy()
    so that it doesn't reinitialize the limits at all.
    
    At the same time, change intel_pstate_set_performance_limits() to
    set min_sysfs_pct to 100 in the "performance" limits set so that
    switching the P-state selection algorithm to "performance" causes
    intel_pstate/min_perf_pct in sysfs to go to 100 (or whatever value
    min_sysfs_pct in the "performance" limits is set to later).
    
    That requires per-CPU limits to be initialized explicitly rather
    than by copying the global limits to avoid setting min_sysfs_pct
    in the per-CPU limits to 100.
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    a240c4aa
intel_pstate.c 69.5 KB