From: Anton Blanchard Anton has been testing odd setups: /* node 0 - no cpus, no memory */ /* node 1 - 1 cpu, no memory */ /* node 2 - 0 cpus, 1GB memory */ /* node 3 - 3 cpus, 3GB memory */ Two things tripped so far. Firstly the ppc64 debug check for invalid cpus in cpu_to_node(). Fix that in kernel/sched.c:node_nr_running_init(). The other problem concerned nodes with memory but no cpus. kswapd tries to set_cpus_allowed(0) and bad things happen. So we only set cpu affinity for kswapd if there are cpus in the node. kernel/sched.c | 7 +++++-- mm/vmscan.c | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff -puN kernel/sched.c~generic-numa-fixes kernel/sched.c --- 25/kernel/sched.c~generic-numa-fixes 2003-06-12 03:14:04.000000000 -0700 +++ 25-akpm/kernel/sched.c 2003-06-12 03:14:04.000000000 -0700 @@ -219,8 +219,11 @@ __init void node_nr_running_init(void) { int i; - for (i = 0; i < NR_CPUS; i++) - cpu_rq(i)->node_nr_running = &node_nr_running[cpu_to_node(i)]; + for (i = 0; i < NR_CPUS; i++) { + if (cpu_possible(i)) + cpu_rq(i)->node_nr_running = + &node_nr_running[cpu_to_node(i)]; + } } #else /* !CONFIG_NUMA */ diff -puN mm/vmscan.c~generic-numa-fixes mm/vmscan.c --- 25/mm/vmscan.c~generic-numa-fixes 2003-06-12 03:14:04.000000000 -0700 +++ 25-akpm/mm/vmscan.c 2003-06-12 03:14:04.000000000 -0700 @@ -956,9 +956,12 @@ int kswapd(void *p) struct reclaim_state reclaim_state = { .reclaimed_slab = 0, }; + unsigned long cpumask; daemonize("kswapd%d", pgdat->node_id); - set_cpus_allowed(tsk, node_to_cpumask(pgdat->node_id)); + cpumask = node_to_cpumask(pgdat->node_id); + if (cpumask) + set_cpus_allowed(tsk, cpumask); current->reclaim_state = &reclaim_state; /* _