From: Nick Piggin "Overlapping" domains of the kind set up on some SGI IA64 systems cause sched_balance_self to go into an infinite loop, because a CPU may not have a domain which is a superset of the referring CPU's domain (apart from the top level domain, in the case of SGI Altix). Signed-off-by: Nick Piggin Signed-off-by: Andrew Morton --- kernel/sched.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) diff -puN kernel/sched.c~sched-consolidate-sbe-sbf-fix-3 kernel/sched.c --- 25/kernel/sched.c~sched-consolidate-sbe-sbf-fix-3 2005-06-09 23:45:15.000000000 -0700 +++ 25-akpm/kernel/sched.c 2005-06-09 23:45:15.000000000 -0700 @@ -1047,6 +1047,7 @@ static int sched_balance_self(int cpu, i cpumask_t span; struct sched_group *group; int new_cpu; + int weight; span = sd->span; group = find_idlest_group(sd, t, cpu); @@ -1061,8 +1062,9 @@ static int sched_balance_self(int cpu, i cpu = new_cpu; nextlevel: sd = NULL; + weight = cpus_weight(span); for_each_domain(cpu, tmp) { - if (cpus_subset(span, tmp->span)) + if (weight <= cpus_weight(tmp->span)) break; if (tmp->flags & flag) sd = tmp; _