• Linus Torvalds's avatar
    Add comments on load balancing special cases. · d95e31c5
    Linus Torvalds authored
    Ingo explains:
    
    The condition is 'impossible', but the whole balancing code is
    (intentionally) a bit racy:
    
                    cpus_and(tmp, group->cpumask, cpu_online_map);
                    if (!cpus_weight(tmp))
                            goto next_group;
    
                    for_each_cpu_mask(i, tmp) {
                            if (!idle_cpu(i))
                                    goto next_group;
                            push_cpu = i;
                    }
    
                    rq = cpu_rq(push_cpu);
                    double_lock_balance(busiest, rq);
                    move_tasks(rq, push_cpu, busiest, 1, sd, IDLE);
    
    in the for_each_cpu_mask() loop we specifically check for each CPU in
    the target group to be idle - so push_cpu's runqueue == busiest [==
    current runqueue] cannot be true because the current CPU is not idle, we
    are running in the migration thread ... But this is not a real problem,
    load-balancing we do in a racy way to reduce overhead [and it's all
    statistics anyway so absolute accuracy is impossible], and active
    balancing itself is somewhat racy due to the migration-thread wakeup
    (and the active_balance flag) going outside the runqueue locks [for
    similar reasons].
    
    so it all looks quite plausible - the normal SMP boxes dont trigger it,
    but Bjorn's 128-CPU setup with a non-trivial domain hiearachy triggers
    it.
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    d95e31c5
sched.c 97.9 KB