
From: Anton Blanchard <anton@samba.org>

 
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;
 
 	/*

_
