• Viresh Kumar's avatar
    cpufreq: schedutil: Don't skip freq update if need_freq_update is set · 23a88185
    Viresh Kumar authored
    The cpufreq policy's frequency limits (min/max) can get changed at any
    point of time, while schedutil is trying to update the next frequency.
    Though the schedutil governor has necessary locking and support in place
    to make sure we don't miss any of those updates, there is a corner case
    where the governor will find that the CPU is already running at the
    desired frequency and so may skip an update.
    
    For example, consider that the CPU can run at 1 GHz, 1.2 GHz and 1.4 GHz
    and is running at 1 GHz currently. Schedutil tries to update the
    frequency to 1.2 GHz, during this time the policy limits get changed as
    policy->min = 1.4 GHz. As schedutil (and cpufreq core) does clamp the
    frequency at various instances, we will eventually set the frequency to
    1.4 GHz, while we will save 1.2 GHz in sg_policy->next_freq.
    
    Now lets say the policy limits get changed back at this time with
    policy->min as 1 GHz. The next time schedutil is invoked by the
    scheduler, we will reevaluate the next frequency (because
    need_freq_update will get set due to limits change event) and lets say
    we want to set the frequency to 1.2 GHz again. At this point
    sugov_update_next_freq() will find the next_freq == current_freq and
    will abort the update, while the CPU actually runs at 1.4 GHz.
    
    Until now need_freq_update was used as a flag to indicate that the
    policy's frequency limits have changed, and that we should consider the
    new limits while reevaluating the next frequency.
    
    This patch fixes the above mentioned issue by extending the purpose of
    the need_freq_update flag. If this flag is set now, the schedutil
    governor will not try to abort a frequency change even if next_freq ==
    current_freq.
    
    As similar behavior is required in the case of
    CPUFREQ_NEED_UPDATE_LIMITS flag as well, need_freq_update will never be
    set to false if that flag is set for the driver.
    
    We also don't need to consider the need_freq_update flag in
    sugov_update_single() anymore to handle the special case of busy CPU, as
    we won't abort a frequency update anymore.
    Reported-by: default avatarzhuguangqing <zhuguangqing@xiaomi.com>
    Suggested-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    [ rjw: Rearrange code to avoid a branch ]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    23a88185
cpufreq_schedutil.c 25.7 KB