From: jbarnes@sgi.com (Jesse Barnes) Now that we have a proper NODES_SHIFT value, we need to use it to define ZONE_SHIFT otherwise we'll spill over 8 bits if we have more than 85 nodes. 25-akpm/include/linux/mm.h | 4 +++- 25-akpm/include/linux/mmzone.h | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff -puN include/linux/mm.h~ZONE_SHIFT-from-NODES_SHIFT include/linux/mm.h --- 25/include/linux/mm.h~ZONE_SHIFT-from-NODES_SHIFT Fri Nov 7 13:51:22 2003 +++ 25-akpm/include/linux/mm.h Fri Nov 7 13:55:11 2003 @@ -322,8 +322,10 @@ static inline void put_page(struct page /* * The zone field is never updated after free_area_init_core() * sets it, so none of the operations on it need to be atomic. + * We'll have up to log2(MAX_NUMNODES * MAX_NR_ZONES) zones + * total, so we use NODES_SHIFT here to get enough bits. */ -#define ZONE_SHIFT (BITS_PER_LONG - 8) +#define ZONE_SHIFT (BITS_PER_LONG - NODES_SHIFT - MAX_NR_ZONES_SHIFT) struct zone; extern struct zone *zone_table[]; diff -puN include/linux/mmzone.h~ZONE_SHIFT-from-NODES_SHIFT include/linux/mmzone.h --- 25/include/linux/mmzone.h~ZONE_SHIFT-from-NODES_SHIFT Fri Nov 7 13:51:49 2003 +++ 25-akpm/include/linux/mmzone.h Fri Nov 7 13:57:19 2003 @@ -159,7 +159,10 @@ struct zone { #define ZONE_DMA 0 #define ZONE_NORMAL 1 #define ZONE_HIGHMEM 2 -#define MAX_NR_ZONES 3 + +#define MAX_NR_ZONES 3 /* Sync this with MAX_NR_ZONES_SHIFT */ +#define MAX_NR_ZONES_SHIFT 2 /* ceil(log2(MAX_NR_ZONES)) */ + #define GFP_ZONEMASK 0x03 /* _