lkml.org 
[lkml]   [2013]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 3/3] sched: Aggressive balance in domains whose groups share package resources
    Hi Peter,

    On 10/23/2013 03:53 AM, Peter Zijlstra wrote:
    > On Mon, Oct 21, 2013 at 05:15:02PM +0530, Vaidyanathan Srinivasan wrote:
    >> kernel/sched/fair.c | 18 ++++++++++++++++++
    >> 1 file changed, 18 insertions(+)
    >>
    >> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
    >> index 828ed97..bbcd96b 100644
    >> --- a/kernel/sched/fair.c
    >> +++ b/kernel/sched/fair.c
    >> @@ -5165,6 +5165,8 @@ static int load_balance(int this_cpu, struct rq *this_rq,
    >> {
    >> int ld_moved, cur_ld_moved, active_balance = 0;
    >> struct sched_group *group;
    >> + struct sched_domain *child;
    >> + int share_pkg_res = 0;
    >> struct rq *busiest;
    >> unsigned long flags;
    >> struct cpumask *cpus = __get_cpu_var(load_balance_mask);
    >> @@ -5190,6 +5192,10 @@ static int load_balance(int this_cpu, struct rq *this_rq,
    >>
    >> schedstat_inc(sd, lb_count[idle]);
    >>
    >> + child = sd->child;
    >> + if (child && child->flags & SD_SHARE_PKG_RESOURCES)
    >> + share_pkg_res = 1;
    >> +
    >> redo:
    >> if (!should_we_balance(&env)) {
    >> *continue_balancing = 0;
    >> @@ -5202,6 +5208,7 @@ redo:
    >> goto out_balanced;
    >> }
    >>
    >> +redo_grp:
    >> busiest = find_busiest_queue(&env, group);
    >> if (!busiest) {
    >> schedstat_inc(sd, lb_nobusyq[idle]);
    >> @@ -5292,6 +5299,11 @@ more_balance:
    >> if (!cpumask_empty(cpus)) {
    >> env.loop = 0;
    >> env.loop_break = sched_nr_migrate_break;
    >> + if (share_pkg_res &&
    >> + cpumask_intersects(cpus,
    >> + to_cpumask(group->cpumask)))
    >
    > sched_group_cpus()
    >
    >> + goto redo_grp;
    >> +
    >> goto redo;
    >> }
    >> goto out_balanced;
    >> @@ -5318,9 +5330,15 @@ more_balance:
    >> */
    >> if (!cpumask_test_cpu(this_cpu,
    >> tsk_cpus_allowed(busiest->curr))) {
    >> + cpumask_clear_cpu(cpu_of(busiest), cpus);
    >> raw_spin_unlock_irqrestore(&busiest->lock,
    >> flags);
    >> env.flags |= LBF_ALL_PINNED;
    >> + if (share_pkg_res &&
    >> + cpumask_intersects(cpus,
    >> + to_cpumask(group->cpumask)))
    >> + goto redo_grp;
    >> +
    >> goto out_one_pinned;
    >> }
    >
    > Man this retry logic is getting annoying.. isn't there anything saner we
    > can do?

    Maybe we can do this just at the SIBLINGS level? Having the hyper
    threads busy due to the scenario described in the changelog is bad for
    performance.

    Regards
    Preeti U Murthy
    > _______________________________________________
    > Linuxppc-dev mailing list
    > Linuxppc-dev@lists.ozlabs.org
    > https://lists.ozlabs.org/listinfo/linuxppc-dev
    >



    \
     
     \ /
      Last update: 2013-10-25 16:01    [W:3.362 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site