lkml.org 
[lkml]   [2018]   [Feb]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/3] sched: reduce the periodic update duration
    Date
    Instead of using the cfs_rq_is_decayed() which monitors all *_avg
    and *_sum, we create a cfs_rq_has_blocked() which only takes care of
    util_avg and load_avg. We are only interested by these 2 values which are
    decaying faster than the *_sum so we can stop the periodic update earlier.

    Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
    ---
    kernel/sched/fair.c | 21 +++++++++++++++++----
    1 file changed, 17 insertions(+), 4 deletions(-)

    diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
    index 279f4b2..6998528 100644
    --- a/kernel/sched/fair.c
    +++ b/kernel/sched/fair.c
    @@ -7337,6 +7337,19 @@ static void attach_tasks(struct lb_env *env)
    rq_unlock(env->dst_rq, &rf);
    }

    +static inline bool cfs_rq_has_blocked(struct cfs_rq *cfs_rq)
    +{
    + if (cfs_rq->avg.load_avg)
    + return true;
    +
    + if (cfs_rq->avg.util_avg)
    + return true;
    +
    + return false;
    +}
    +
    +#ifdef CONFIG_FAIR_GROUP_SCHED
    +
    static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq)
    {
    if (cfs_rq->load.weight)
    @@ -7354,8 +7367,6 @@ static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq)
    return true;
    }

    -#ifdef CONFIG_FAIR_GROUP_SCHED
    -
    static void update_blocked_averages(int cpu)
    {
    struct rq *rq = cpu_rq(cpu);
    @@ -7391,7 +7402,9 @@ static void update_blocked_averages(int cpu)
    */
    if (cfs_rq_is_decayed(cfs_rq))
    list_del_leaf_cfs_rq(cfs_rq);
    - else
    +
    + /* Don't need periodic decay once load/util_avg are null */
    + if (cfs_rq_has_blocked(cfs_rq))
    done = false;
    }

    @@ -7461,7 +7474,7 @@ static inline void update_blocked_averages(int cpu)
    update_cfs_rq_load_avg(cfs_rq_clock_task(cfs_rq), cfs_rq);
    #ifdef CONFIG_NO_HZ_COMMON
    rq->last_blocked_load_update_tick = jiffies;
    - if (cfs_rq_is_decayed(cfs_rq))
    + if (!cfs_rq_has_blocked(cfs_rq))
    rq->has_blocked_load = 0;
    #endif
    rq_unlock_irqrestore(rq, &rf);
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-02-06 09:33    [W:4.338 / U:0.756 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site