From: Matthew Dobson 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 - -/* 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" }; _