lkml.org 
[lkml]   [2013]   [Oct]   [24]   [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?

    Let me give this a thought and get back.

    Regards
    Preeti U Murthy
    >



    \
     
     \ /
      Last update: 2013-10-24 06:41    [W:3.484 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site