lkml.org 
[lkml]   [2018]   [May]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v3 02/10] sched/cpufreq: Factor out utilization to frequency mapping
    Date
    The schedutil governor maps utilization values to frequencies by applying
    a 25% margin. Since this sort of mapping mechanism can be needed by other
    users (i.e. EAS), factor the utilization-to-frequency mapping code out
    of schedutil and move it to include/linux/sched/cpufreq.h to avoid code
    duplication. The new map_util_freq() function is inlined to avoid
    overheads.

    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Signed-off-by: Quentin Perret <quentin.perret@arm.com>
    ---
    include/linux/sched/cpufreq.h | 6 ++++++
    kernel/sched/cpufreq_schedutil.c | 3 ++-
    2 files changed, 8 insertions(+), 1 deletion(-)

    diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h
    index 59667444669f..afa940cd50dc 100644
    --- a/include/linux/sched/cpufreq.h
    +++ b/include/linux/sched/cpufreq.h
    @@ -20,6 +20,12 @@ void cpufreq_add_update_util_hook(int cpu, struct update_util_data *data,
    void (*func)(struct update_util_data *data, u64 time,
    unsigned int flags));
    void cpufreq_remove_update_util_hook(int cpu);
    +
    +static inline unsigned long map_util_freq(unsigned long util,
    + unsigned long freq, unsigned long cap)
    +{
    + return (freq + (freq >> 2)) * util / cap;
    +}
    #endif /* CONFIG_CPU_FREQ */

    #endif /* _LINUX_SCHED_CPUFREQ_H */
    diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
    index 63014cff76a5..4fdc6eb7c88b 100644
    --- a/kernel/sched/cpufreq_schedutil.c
    +++ b/kernel/sched/cpufreq_schedutil.c
    @@ -13,6 +13,7 @@

    #include "sched.h"

    +#include <linux/sched/cpufreq.h>
    #include <trace/events/power.h>

    struct sugov_tunables {
    @@ -163,7 +164,7 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy,
    unsigned int freq = arch_scale_freq_invariant() ?
    policy->cpuinfo.max_freq : policy->cur;

    - freq = (freq + (freq >> 2)) * util / max;
    + freq = map_util_freq(util, freq, max);

    if (freq == sg_policy->cached_raw_freq && sg_policy->next_freq != UINT_MAX)
    return sg_policy->next_freq;
    --
    2.17.0
    \
     
     \ /
      Last update: 2018-05-21 16:28    [W:20.440 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site