From: Nick Piggin <nickpiggin@yahoo.com.au>

"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 <nickpiggin@yahoo.com.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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;
_