From: Matthew Dobson <colpatch@us.ibm.com>

Remove MAX_NR_NODES.  This value is only used in a couple of places, and
it's incorrectly used in all those places as far as I can tell.  Replace
with MAX_NUMNODES.  Create MAX_NODES_SHIFT and use this value to check
NODES_SHIFT is appropriate.  A possible future patch should make
MAX_NODES_SHIFT vary based on 32 vs.  64 bit archs.



 arch/i386/kernel/smpboot.c |    6 +++---
 include/linux/mmzone.h     |   16 ++++++++++++----
 mm/page_alloc.c            |    2 +-
 3 files changed, 16 insertions(+), 8 deletions(-)

diff -puN arch/i386/kernel/smpboot.c~node-enumeration-cleanup-02 arch/i386/kernel/smpboot.c
--- 25/arch/i386/kernel/smpboot.c~node-enumeration-cleanup-02	2003-09-16 00:15:47.000000000 -0700
+++ 25-akpm/arch/i386/kernel/smpboot.c	2003-09-16 00:15:47.000000000 -0700
@@ -499,8 +499,8 @@ static struct task_struct * __init fork_
 #ifdef CONFIG_NUMA
 
 /* which logical CPUs are on which nodes */
-cpumask_t node_2_cpu_mask[MAX_NR_NODES] =
-				{ [0 ... MAX_NR_NODES-1] = CPU_MASK_NONE };
+cpumask_t node_2_cpu_mask[MAX_NUMNODES] =
+				{ [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE };
 /* which node each logical CPU is on */
 int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 };
 
@@ -518,7 +518,7 @@ static inline void unmap_cpu_to_node(int
 	int node;
 
 	printk("Unmapping cpu %d from all nodes\n", cpu);
-	for (node = 0; node < MAX_NR_NODES; node ++)
+	for (node = 0; node < MAX_NUMNODES; node ++)
 		cpu_clear(cpu, node_2_cpu_mask[node]);
 	cpu_2_node[cpu] = -1;
 }
diff -puN include/linux/mmzone.h~node-enumeration-cleanup-02 include/linux/mmzone.h
--- 25/include/linux/mmzone.h~node-enumeration-cleanup-02	2003-09-16 00:15:47.000000000 -0700
+++ 25-akpm/include/linux/mmzone.h	2003-09-16 00:15:47.000000000 -0700
@@ -304,19 +304,27 @@ extern void setup_per_zone_pages_min(voi
 #define numa_node_id()		(cpu_to_node(smp_processor_id()))
 
 #ifndef CONFIG_DISCONTIGMEM
+
 extern struct pglist_data contig_page_data;
 #define NODE_DATA(nid)		(&contig_page_data)
 #define NODE_MEM_MAP(nid)	mem_map
-#define MAX_NR_NODES		1
+#define MAX_NODES_SHIFT		0
+
 #else /* CONFIG_DISCONTIGMEM */
 
 #include <asm/mmzone.h>
-
-/* page->zone is currently 8 bits ... */
-#define MAX_NR_NODES		(255 / MAX_NR_ZONES)
+/*
+ * page->zone is currently 8 bits
+ * there are 3 zones (2 bits)
+ * this leaves 8-2=6 bits for nodes
+ */
+#define MAX_NODES_SHIFT		6
 
 #endif /* !CONFIG_DISCONTIGMEM */
 
+#if NODES_SHIFT > MAX_NODES_SHIFT
+#error NODES_SHIFT > MAX_NODES_SHIFT
+#endif
 
 extern DECLARE_BITMAP(node_online_map, MAX_NUMNODES);
 extern DECLARE_BITMAP(memblk_online_map, MAX_NR_MEMBLKS);
diff -puN mm/page_alloc.c~node-enumeration-cleanup-02 mm/page_alloc.c
--- 25/mm/page_alloc.c~node-enumeration-cleanup-02	2003-09-16 00:15:47.000000000 -0700
+++ 25-akpm/mm/page_alloc.c	2003-09-16 00:15:47.000000000 -0700
@@ -50,7 +50,7 @@ EXPORT_SYMBOL(nr_swap_pages);
  * Used by page_zone() to look up the address of the struct zone whose
  * id is encoded in the upper bits of page->flags
  */
-struct zone *zone_table[MAX_NR_ZONES*MAX_NR_NODES];
+struct zone *zone_table[MAX_NR_ZONES*MAX_NUMNODES];
 EXPORT_SYMBOL(zone_table);
 
 static char *zone_names[MAX_NR_ZONES] = { "DMA", "Normal", "HighMem" };

_