• Rafael J. Wysocki's avatar
    cpufreq: governor: Fix handling of special cases in dbs_update() · 9485e4ca
    Rafael J. Wysocki authored
    As reported in KBZ 69821:
    
    "With CONFIG_HZ_PERIODIC=y cpu stays at the lowest frequcency 800MHz
     even if usage goes to 100%, frequency does not scale up, the governor
     in use is ondemand. Neither works conservative. Performance and
     userspace governors work as expected.
    
     With CONFIG_NO_HZ_IDLE or CONFIG_NO_HZ_FULL cpu scales up with ondemand
     as expected."
    
    Analysis carried out by Chen Yu leads to the conclusion that the
    observed issue is due to idle_time in dbs_update() representing a
    negative number in which case the function will return 0 as the load
    (unless load is greater than 0 for another CPU sharing the policy),
    although that need not be the right choice.
    
    Indeed, idle_time representing a negative number means that during
    the last sampling interval the CPU was almost 100% busy on the rough
    average, so 100 should be returned as the load in that case.
    
    Modify the code accordingly and rearrange it to clarify the handling
    of all of the special cases in it.  While at it, also avoid returning
    zero as the load if time_elapsed is 0 (it doesn't really make sense
    to return 0 then).
    
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=69821Tested-by: default avatarChen Yu <yu.c.chen@intel.com>
    Tested-by: default avatarTimo Valtoaho <timo.valtoaho@gmail.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    9485e4ca
cpufreq_governor.c 16.9 KB