lkml.org 
[lkml]   [2011]   [Sep]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 2/2] sched: request for idle balance during nohz idle load balance
    rq's idle_at_tick is set to idle/busy during the timer tick
    depending on the cpu was idle or not. This will be used later in the load
    balance that will be done in the softirq context (which is a process
    context in -RT kernels).

    For nohz kernels, for the cpu doing nohz idle load balance on behalf of
    all the idle cpu's, its rq->idle_at_tick might have a stale value (which is
    recorded when it got the timer tick presumably when it is busy).

    As the nohz idle load balancing is also being done at the same place
    as the regular load balancing, nohz idle load balancing was bailing out
    when it sees rq's idle_at_tick not set.

    Thus leading to poor system utilization.

    Rename rq's idle_at_tick to idle_balance and set it when someone requests
    for nohz idle balance on an idle cpu.

    Reported-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
    Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
    ---
    kernel/sched.c | 8 +++++---
    kernel/sched_fair.c | 4 ++--
    2 files changed, 7 insertions(+), 5 deletions(-)

    Index: linux-2.6-tip/kernel/sched.c
    ===================================================================
    --- linux-2.6-tip.orig/kernel/sched.c
    +++ linux-2.6-tip/kernel/sched.c
    @@ -644,7 +644,7 @@ struct rq {

    unsigned long cpu_power;

    - unsigned char idle_at_tick;
    + unsigned char idle_balance;
    /* For active balancing */
    int post_schedule;
    int active_balance;
    @@ -2758,8 +2758,10 @@ void scheduler_ipi(void)
    * Check if someone kicked us for doing the nohz idle load balance.
    */
    if (unlikely((rq->idle == current) && rq->nohz_balance_kick &&
    - !need_resched()))
    + !need_resched())) {
    + rq->idle_balance = 1;
    raise_softirq_irqoff(SCHED_SOFTIRQ);
    + }
    irq_exit();
    }

    @@ -4266,7 +4268,7 @@ void scheduler_tick(void)
    perf_event_task_tick();

    #ifdef CONFIG_SMP
    - rq->idle_at_tick = idle_cpu(cpu);
    + rq->idle_balance = idle_cpu(cpu);
    trigger_load_balance(rq, cpu);
    #endif
    }
    Index: linux-2.6-tip/kernel/sched_fair.c
    ===================================================================
    --- linux-2.6-tip.orig/kernel/sched_fair.c
    +++ linux-2.6-tip/kernel/sched_fair.c
    @@ -4674,7 +4674,7 @@ static inline int nohz_kick_needed(struc
    if (time_before(now, nohz.next_balance))
    return 0;

    - if (rq->idle_at_tick)
    + if (idle_cpu(cpu))
    return 0;

    first_pick_cpu = atomic_read(&nohz.first_pick_cpu);
    @@ -4710,7 +4710,7 @@ static void run_rebalance_domains(struct
    {
    int this_cpu = smp_processor_id();
    struct rq *this_rq = cpu_rq(this_cpu);
    - enum cpu_idle_type idle = this_rq->idle_at_tick ?
    + enum cpu_idle_type idle = this_rq->idle_balance ?
    CPU_IDLE : CPU_NOT_IDLE;

    rebalance_domains(this_cpu, idle);



    \
     
     \ /
      Last update: 2011-09-30 00:39    [W:0.023 / U:29.892 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site