
From: Anton Blanchard <anton@samba.org>

Allow SD_NODES_PER_DOMAIN to be overridden.  On ppc64 set this at 16 so our
top level scheduling domains will include all nodes.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/kernel/sched.c |   23 +++++++++++++++--------
 1 files changed, 15 insertions(+), 8 deletions(-)

diff -puN kernel/sched.c~ppc64-allow-sd_nodes_per_domain-to-be-overridden kernel/sched.c
--- 25/kernel/sched.c~ppc64-allow-sd_nodes_per_domain-to-be-overridden	2004-09-05 14:43:35.636763464 -0700
+++ 25-akpm/kernel/sched.c	2004-09-05 14:43:35.653760880 -0700
@@ -4048,7 +4048,12 @@ static void cpu_attach_domain(struct sch
 	unlock_cpu_hotplug();
 }
 
-#ifdef CONFIG_NUMA
+/*
+ * To enable disjoint top-level NUMA domains, define SD_NODES_PER_DOMAIN
+ * in arch code. That defines the number of nearby nodes in a node's top
+ * level scheduling domain.
+ */
+#if defined(CONFIG_NUMA) && defined(SD_NODES_PER_DOMAIN)
 /**
  * find_next_best_node - find the next node to include in a sched_domain
  * @node: node whose sched_domain we're building
@@ -4095,7 +4100,7 @@ static int __init find_next_best_node(in
  * should be one that prevents unnecessary balancing, but also spreads tasks
  * out optimally.
  */
-cpumask_t __init sched_domain_node_span(int node, int size)
+cpumask_t __init sched_domain_node_span(int node)
 {
 	int i;
 	cpumask_t span;
@@ -4104,7 +4109,7 @@ cpumask_t __init sched_domain_node_span(
 	cpus_clear(span);
 	bitmap_zero(used_nodes, MAX_NUMNODES);
 
-	for (i = 0; i < size; i++) {
+	for (i = 0; i < SD_NODES_PER_DOMAIN; i++) {
 		int next_node = find_next_best_node(node, used_nodes);
 		cpumask_t  nodemask;
 
@@ -4114,7 +4119,12 @@ cpumask_t __init sched_domain_node_span(
 
 	return span;
 }
-#endif /* CONFIG_NUMA */
+#else /* CONFIG_NUMA && SD_NODES_PER_DOMAIN */
+cpumask_t __init sched_domain_node_span(int node)
+{
+	return cpu_possible_map;
+}
+#endif /* CONFIG_NUMA && SD_NODES_PER_DOMAIN */
 
 #ifdef CONFIG_SCHED_SMT
 static DEFINE_PER_CPU(struct sched_domain, cpu_domains);
@@ -4138,9 +4148,6 @@ __init static int cpu_to_phys_group(int 
 
 #ifdef CONFIG_NUMA
 
-/* Number of nearby nodes in a node's scheduling domain */
-#define SD_NODES_PER_DOMAIN 4
-
 static DEFINE_PER_CPU(struct sched_domain, node_domains);
 static struct sched_group sched_group_nodes[MAX_NUMNODES];
 __init static int cpu_to_node_group(int cpu)
@@ -4267,7 +4274,7 @@ __init static void arch_init_sched_domai
 		group = cpu_to_node_group(i);
 		*sd = SD_NODE_INIT;
 		/* FIXME: should be multilevel, in arch code */
-		sd->span = sched_domain_node_span(i, SD_NODES_PER_DOMAIN);
+		sd->span = sched_domain_node_span(i);
 		cpus_and(sd->span, sd->span, cpu_default_map);
 		sd->groups = &sched_group_nodes[group];
 #endif
_
