lkml.org 
[lkml]   [2021]   [Jun]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 083/146] sched/pelt: Ensure that *_sum is always synced with *_avg
    Date
    From: Vincent Guittot <vincent.guittot@linaro.org>

    [ Upstream commit fcf6631f3736985ec89bdd76392d3c7bfb60119f ]

    Rounding in PELT calculation happening when entities are attached/detached
    of a cfs_rq can result into situations where util/runnable_avg is not null
    but util/runnable_sum is. This is normally not possible so we need to
    ensure that util/runnable_sum stays synced with util/runnable_avg.

    detach_entity_load_avg() is the last place where we don't sync
    util/runnable_sum with util/runnbale_avg when moving some sched_entities

    Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20210601085832.12626-1-vincent.guittot@linaro.org
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    kernel/sched/fair.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
    index ff8a172a69ca..d6e1c90de570 100644
    --- a/kernel/sched/fair.c
    +++ b/kernel/sched/fair.c
    @@ -3767,11 +3767,17 @@ static void attach_entity_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *s
    */
    static void detach_entity_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *se)
    {
    + /*
    + * cfs_rq->avg.period_contrib can be used for both cfs_rq and se.
    + * See ___update_load_avg() for details.
    + */
    + u32 divider = get_pelt_divider(&cfs_rq->avg);
    +
    dequeue_load_avg(cfs_rq, se);
    sub_positive(&cfs_rq->avg.util_avg, se->avg.util_avg);
    - sub_positive(&cfs_rq->avg.util_sum, se->avg.util_sum);
    + cfs_rq->avg.util_sum = cfs_rq->avg.util_avg * divider;
    sub_positive(&cfs_rq->avg.runnable_avg, se->avg.runnable_avg);
    - sub_positive(&cfs_rq->avg.runnable_sum, se->avg.runnable_sum);
    + cfs_rq->avg.runnable_sum = cfs_rq->avg.runnable_avg * divider;

    add_tg_cfs_propagate(cfs_rq, -se->avg.load_sum);

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-06-21 18:34    [W:4.025 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site