• Rafael J. Wysocki's avatar
    cpufreq: intel_pstate: Active mode P-state limits rework · c5a2ee7d
    Rafael J. Wysocki authored
    The coordination of P-state limits used by intel_pstate in the active
    mode (ie. by default) is problematic, because it synchronizes all of
    the limits (ie. the global ones and the per-policy ones) so as to use
    one common pair of P-state limits (min and max) across all CPUs in
    the system.  The drawbacks of that are as follows:
    
     - If P-states are coordinated in hardware, it is not necessary
       to coordinate them in software on top of that, so in that case
       all of the above activity is in vain.
    
     - If P-states are not coordinated in hardware, then the processor
       is actually capable of setting different P-states for different
       CPUs and coordinating them at the software level simply doesn't
       allow that capability to be utilized.
    
     - The coordination works in such a way that setting a per-policy
       limit (eg. scaling_max_freq) for one CPU causes the common
       effective limit to change (and it will affect all of the other
       CPUs too), but subsequent reads from the corresponding sysfs
       attributes for the other CPUs will return stale values (which
       is confusing).
    
     - Reads from the global P-state limit attributes, min_perf_pct and
       max_perf_pct, return the effective common values and not the last
       values set through these attributes.  However, the last values
       set through these attributes become hard limits that cannot be
       exceeded by writes to scaling_min_freq and scaling_max_freq,
       respectively, and they are not exposed, so essentially users
       have to remember what they are.
    
    All of that is painful enough to warrant a change of the management
    of P-state limits in the active mode.
    
    To that end, redesign the active mode P-state limits management in
    intel_pstate in accordance with the following rules:
    
     (1) All CPUs are affected by the global limits (that is, none of
         them can be requested to run faster than the global max and
         none of them can be requested to run slower than the global
         min).
    
     (2) Each individual CPU is affected by its own per-policy limits
         (that is, it cannot be requested to run faster than its own
         per-policy max and it cannot be requested to run slower than
         its own per-policy min).
    
     (3) The global and per-policy limits can be set independently.
    
    Also, the global maximum and minimum P-state limits will be always
    expressed as percentages of the maximum supported turbo P-state.
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    c5a2ee7d
intel_pstate.c 66.6 KB