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 debug check for invalid cpus in cpu_to_node(). Fix that in kenrel/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. In this case set it to cpu_online_map, but maybe we should probably just skip set_cpus_allowed completely in this case. kernel/sched.c | 7 +++++-- mm/vmscan.c | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff -puN kernel/sched.c~odd-numa-fixes kernel/sched.c --- 25/kernel/sched.c~odd-numa-fixes 2003-06-07 18:01:49.000000000 -0700 +++ 25-akpm/kernel/sched.c 2003-06-07 18:01:49.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~odd-numa-fixes mm/vmscan.c --- 25/mm/vmscan.c~odd-numa-fixes 2003-06-07 18:01:49.000000000 -0700 +++ 25-akpm/mm/vmscan.c 2003-06-07 18:01:49.000000000 -0700 @@ -956,9 +956,13 @@ 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) + cpumask = cpu_online_map; + set_cpus_allowed(tsk, cpumask); current->reclaim_state = &reclaim_state; /* _