summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorWilliam Lee Irwin III <wli@holomorphy.com>2004-09-03 04:48:28 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-09-03 04:48:28 -0700
commitc3272d7c12a2157f8fe96cee615da30af94814bc (patch)
tree5a1fe2faae0972e348f84def194b28c7cc1d5089 /kernel
parenteaa8fe26a2be586b583286d1af8e57dc649e07ab (diff)
[PATCH] fix sched_domains hotplug bootstrap ordering vs. cpu_online_map issue
cpu_online_map is not set up at the time of sched domain initialization when hotplug cpu paths are used for SMP booting. At this phase of bootstrapping, cpu_possible_map can be used by the various architectures using cpu hotplugging for SMP bootstrap, but the manipulations of cpu_online_map done on behalf of NUMA architectures, done indirectly via node_to_cpumask(), can't, because cpu_online_map starts depopulated and hasn't yet been populated. On true NUMA architectures this is a distinct cpumask_t from cpu_online_map and so the unpatched code works on NUMA; on non-NUMA architectures the definition of node_to_cpumask() this way breaks and would require an invasive sweeping of users of node_to_cpumask() to change it to e.g. cpu_possible_map, as cpu_possible_map is not suitable for use at runtime as a substitute for cpu_online_map. Signed-off-by: William Irwin <wli@holomorphy.com> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 969a297b9f24..915a794079b2 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4468,7 +4468,11 @@ __init static void arch_init_sched_domains(void)
sd = &per_cpu(phys_domains, i);
group = cpu_to_phys_group(i);
*sd = SD_CPU_INIT;
+#ifdef CONFIG_NUMA
sd->span = nodemask;
+#else
+ sd->span = cpu_possible_map;
+#endif
sd->parent = p;
sd->groups = &sched_group_phys[group];
@@ -4506,6 +4510,7 @@ __init static void arch_init_sched_domains(void)
&cpu_to_isolated_group);
}
+#ifdef CONFIG_NUMA
/* Set up physical groups */
for (i = 0; i < MAX_NUMNODES; i++) {
cpumask_t nodemask = node_to_cpumask(i);
@@ -4517,6 +4522,10 @@ __init static void arch_init_sched_domains(void)
init_sched_build_groups(sched_group_phys, nodemask,
&cpu_to_phys_group);
}
+#else
+ init_sched_build_groups(sched_group_phys, cpu_possible_map,
+ &cpu_to_phys_group);
+#endif
#ifdef CONFIG_NUMA
/* Set up node groups */