From: Anton Blanchard 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 Signed-off-by: Andrew Morton --- 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 _