diff options
| author | William Lee Irwin III <wli@holomorphy.com> | 2004-09-03 04:48:28 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-09-03 04:48:28 -0700 |
| commit | c3272d7c12a2157f8fe96cee615da30af94814bc (patch) | |
| tree | 5a1fe2faae0972e348f84def194b28c7cc1d5089 /kernel | |
| parent | eaa8fe26a2be586b583286d1af8e57dc649e07ab (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.c | 9 |
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 */ |
