lkml.org 
[lkml]   [2015]   [Nov]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 1/3] sched/fair: Avoid redundant idle_cpu() call in update_sg_lb_stats()
    Date
    Part of the responsibility of the update_sg_lb_stats() function is to
    update the idle_cpus statistical counter in struct sg_lb_stats. This
    check is done by calling idle_cpu(). The idle_cpu() function, in
    turn, checks a number of fields within the run queue structure such
    as rq->curr and rq->nr_running.

    With the current layout of the run queue structure, rq->curr and
    rq->nr_running are in separate cachelines. The rq->curr variable is
    checked first followed by nr_running. As nr_running is also accessed
    by update_sg_lb_stats() earlier, it makes no sense to load another
    cacheline when nr_running is not 0 as idle_cpu() will always return
    false in this case.

    This patch eliminates this redundant cacheline load by checking the
    cached nr_running before calling idle_cpu().

    Signed-off-by: Waiman Long <Waiman.Long@hpe.com>
    ---
    kernel/sched/fair.c | 10 +++++++---
    1 files changed, 7 insertions(+), 3 deletions(-)

    diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
    index f04fda8..8f1eccc 100644
    --- a/kernel/sched/fair.c
    +++ b/kernel/sched/fair.c
    @@ -6302,7 +6302,7 @@ static inline void update_sg_lb_stats(struct lb_env *env,
    bool *overload)
    {
    unsigned long load;
    - int i;
    + int i, nr_running;

    memset(sgs, 0, sizeof(*sgs));

    @@ -6319,7 +6319,8 @@ static inline void update_sg_lb_stats(struct lb_env *env,
    sgs->group_util += cpu_util(i);
    sgs->sum_nr_running += rq->cfs.h_nr_running;

    - if (rq->nr_running > 1)
    + nr_running = rq->nr_running;
    + if (nr_running > 1)
    *overload = true;

    #ifdef CONFIG_NUMA_BALANCING
    @@ -6327,7 +6328,10 @@ static inline void update_sg_lb_stats(struct lb_env *env,
    sgs->nr_preferred_running += rq->nr_preferred_running;
    #endif
    sgs->sum_weighted_load += weighted_cpuload(i);
    - if (idle_cpu(i))
    + /*
    + * No need to call idle_cpu() if nr_running is not 0
    + */
    + if (!nr_running && idle_cpu(i))
    sgs->idle_cpus++;
    }

    --
    1.7.1


    \
     
     \ /
      Last update: 2015-11-25 20:41    [W:2.730 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site