lkml.org 
[lkml]   [2018]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 007/222] cpufreq: conservative: Take limits changes into account properly
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

    commit da5e79bc70b84971d2b3a55fb252e34e51d81d48 upstream.

    If the policy limits change between invocations of cs_dbs_update(),
    the requested frequency value stored in dbs_info may not be updated
    and the function may use a stale value of it next time. Moreover, if
    idle periods are takem into account by cs_dbs_update(), the requested
    frequency value stored in dbs_info may be below the min policy limit,
    which is incorrect.

    To fix these problems, always update the requested frequency value
    in dbs_info along with the local copy of it when the previous
    requested frequency is beyond the policy limits and avoid decreasing
    the requested frequency below the min policy limit when taking
    idle periods into account.

    Fixes: abb6627910a1 (cpufreq: conservative: Fix next frequency selection)
    Fixes: 00bfe05889e9 (cpufreq: conservative: Decrease frequency faster for deferred updates)
    Reported-by: Waldemar Rymarkiewicz <waldemarx.rymarkiewicz@intel.com>
    Cc: All applicable <stable@vger.kernel.org>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: Waldemar Rymarkiewicz <waldemarx.rymarkiewicz@intel.com>
    Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/cpufreq/cpufreq_conservative.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/drivers/cpufreq/cpufreq_conservative.c
    +++ b/drivers/cpufreq/cpufreq_conservative.c
    @@ -80,8 +80,10 @@ static unsigned int cs_dbs_update(struct
    * changed in the meantime, so fall back to current frequency in that
    * case.
    */
    - if (requested_freq > policy->max || requested_freq < policy->min)
    + if (requested_freq > policy->max || requested_freq < policy->min) {
    requested_freq = policy->cur;
    + dbs_info->requested_freq = requested_freq;
    + }

    freq_step = get_freq_step(cs_tuners, policy);

    @@ -92,7 +94,7 @@ static unsigned int cs_dbs_update(struct
    if (policy_dbs->idle_periods < UINT_MAX) {
    unsigned int freq_steps = policy_dbs->idle_periods * freq_step;

    - if (requested_freq > freq_steps)
    + if (requested_freq > policy->min + freq_steps)
    requested_freq -= freq_steps;
    else
    requested_freq = policy->min;

    \
     
     \ /
      Last update: 2018-11-12 00:08    [W:5.868 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site