f68f447e83
I've already sent this to the maintainers, and this is now being sent to a larger community audience. I have fixed a problem with the ia64 version of build_sched_domains(), but a similar fix still needs to be made to the generic build_sched_domains() in kernel/sched.c. The "dynamic sched domains" functionality has recently been merged into 2.6.13-rcN that sees the dynamic declaration of a cpu-exclusive (a.k.a. "isolated") cpuset and rebuilds the CPU Scheduler sched domains and sched groups to separate away the CPUs in this cpu-exclusive cpuset from the remainder of the non-isolated CPUs. This allows the non-isolated CPUs to completely ignore the isolated CPUs when doing load-balancing. Unfortunately, build_sched_domains() expects that a sched domain will include all the CPUs of each node in the domain, i.e., that no node will belong in both an isolated cpuset and a non-isolated cpuset. Declaring a cpuset that violates this presumption will produce flawed data structures and will oops the kernel. To trigger the problem (on a NUMA system with >1 CPUs per node): cd /dev/cpuset mkdir newcpuset cd newcpuset echo 0 >cpus echo 0 >mems echo 1 >cpu_exclusive I have fixed this shortcoming for ia64 NUMA (with multiple CPUs per node). A similar shortcoming exists in the generic build_sched_domains() (in kernel/sched.c) for NUMA, and that needs to be fixed also. The fix involves dynamically allocating sched_group_nodes[] and sched_group_allnodes[] for each invocation of build_sched_domains(), rather than using global arrays for these structures. Care must be taken to remember kmalloc() addresses so that arch_destroy_sched_domains() can properly kfree() the new dynamic structures. Signed-off-by: John Hawkes <hawkes@sgi.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Ingo Molnar <mingo@elte.hu> Cc: "Luck, Tony" <tony.luck@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org> |
||
---|---|---|
.. | ||
cpufreq | ||
acpi-ext.c | ||
acpi.c | ||
asm-offsets.c | ||
brl_emu.c | ||
cyclone.c | ||
domain.c | ||
efi_stub.S | ||
efi.c | ||
entry.h | ||
entry.S | ||
fsys.S | ||
gate-data.S | ||
gate.lds.S | ||
gate.S | ||
head.S | ||
ia64_ksyms.c | ||
init_task.c | ||
iosapic.c | ||
irq_ia64.c | ||
irq_lsapic.c | ||
irq.c | ||
ivt.S | ||
jprobes.S | ||
kprobes.c | ||
machvec.c | ||
Makefile | ||
mca_asm.S | ||
mca_drv_asm.S | ||
mca_drv.c | ||
mca_drv.h | ||
mca.c | ||
minstate.h | ||
module.c | ||
numa.c | ||
pal.S | ||
palinfo.c | ||
patch.c | ||
perfmon_default_smpl.c | ||
perfmon_generic.h | ||
perfmon_itanium.h | ||
perfmon_mckinley.h | ||
perfmon.c | ||
process.c | ||
ptrace.c | ||
sal.c | ||
salinfo.c | ||
semaphore.c | ||
setup.c | ||
sigframe.h | ||
signal.c | ||
smp.c | ||
smpboot.c | ||
sys_ia64.c | ||
time.c | ||
topology.c | ||
traps.c | ||
unaligned.c | ||
uncached.c | ||
unwind_decoder.c | ||
unwind_i.h | ||
unwind.c | ||
vmlinux.lds.S |