From: Matthew Dobson Here's a small update to the numnodes fix that went into -mm3. The biggest changes are: 1) move the actual NODES_SHIFT and MAX_NUMNODES definitions into linux/numa.h and include this in linux/mmzone.h, instead of being directly in linux/mmzone.h. This allows other files to include *just* the NUMNODES stuff w/out grabbing all of mmzone.h. 2) pull NODE_SHIFT out of linux/mm.h. This isn't used anywhere in the kernel, and it will only get confused with NODES_SHIFT. 3) Fix the IA64 patch. The original patch I had sent out hadn't been tested on IA64. It was mostly right, but there were circular dependencies. All better now, and acked by Jesse. 4) In linux/mmzone.h, insert code to define MAX_NODES_SHIFT based on the size of unsigned long. For 64-bit arches, we can have a much larger value. This allows IA64 to have 100's or 1000's of nodes. MAX_NODES_SHIFT is defined as 10 (ie: 1024 nodes) for 64-bit for now, although it could likely be much larger. For 32-bit it is 6 (ie: 64 nodes). 5) Small cleanup in include/asm-arm/memory.h. Mostly the result of the new linux/numa.h file. Much cleaner and more readable now. include/asm-arm/memory.h | 17 ++++++----------- include/asm-ia64/nodedata.h | 8 +++----- include/asm-ia64/numa.h | 4 ++-- include/asm-ia64/sn/pda.h | 2 +- include/linux/mm.h | 1 - include/linux/mmzone.h | 21 +++++++++++---------- include/linux/numa.h | 16 ++++++++++++++++ 7 files changed, 39 insertions(+), 30 deletions(-) diff -puN include/asm-arm/memory.h~node-enumeration-cleanup-fix-01 include/asm-arm/memory.h --- 25/include/asm-arm/memory.h~node-enumeration-cleanup-fix-01 2003-09-26 22:21:32.000000000 -0700 +++ 25-akpm/include/asm-arm/memory.h 2003-09-26 22:21:32.000000000 -0700 @@ -84,27 +84,24 @@ static inline void *phys_to_virt(unsigne #define PHYS_TO_NID(addr) (0) -#else +#else /* CONFIG_DISCONTIGMEM */ + /* * This is more complex. We have a set of mem_map arrays spread * around in memory. */ -#include -#define NUM_NODES (1 << NODES_SHIFT) +#include #define page_to_pfn(page) \ (( (page) - page_zone(page)->zone_mem_map) \ + page_zone(page)->zone_start_pfn) - #define pfn_to_page(pfn) \ (PFN_TO_MAPBASE(pfn) + LOCAL_MAP_NR((pfn) << PAGE_SHIFT)) - -#define pfn_valid(pfn) (PFN_TO_NID(pfn) < NUM_NODES) +#define pfn_valid(pfn) (PFN_TO_NID(pfn) < MAX_NUMNODES) #define virt_to_page(kaddr) \ (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr)) - -#define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < NUM_NODES) +#define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < MAX_NUMNODES) /* * Common discontigmem stuff. @@ -112,9 +109,7 @@ static inline void *phys_to_virt(unsigne */ #define PHYS_TO_NID(addr) PFN_TO_NID((addr) >> PAGE_SHIFT) -#undef NUM_NODES - -#endif +#endif /* !CONFIG_DISCONTIGMEM */ /* * For BIO. "will die". Kill me when bio_to_phys() and bvec_to_phys() die. diff -puN include/asm-ia64/nodedata.h~node-enumeration-cleanup-fix-01 include/asm-ia64/nodedata.h --- 25/include/asm-ia64/nodedata.h~node-enumeration-cleanup-fix-01 2003-09-26 22:21:32.000000000 -0700 +++ 25-akpm/include/asm-ia64/nodedata.h 2003-09-26 22:21:32.000000000 -0700 @@ -8,13 +8,11 @@ * Copyright (c) 2002 Erich Focht * Copyright (c) 2002 Kimio Suganuma */ - - #ifndef _ASM_IA64_NODEDATA_H #define _ASM_IA64_NODEDATA_H - -#include +#include +#include /* * Node Data. One of these structures is located on each node of a NUMA system. @@ -24,7 +22,7 @@ struct pglist_data; struct ia64_node_data { short active_cpu_count; short node; - struct pglist_data *pg_data_ptrs[MAX_NUMNODES]; + struct pglist_data *pg_data_ptrs[MAX_NUMNODES]; struct page *bank_mem_map_base[NR_BANKS]; struct ia64_node_data *node_data_ptrs[MAX_NUMNODES]; short node_id_map[NR_BANKS]; diff -puN include/asm-ia64/numa.h~node-enumeration-cleanup-fix-01 include/asm-ia64/numa.h --- 25/include/asm-ia64/numa.h~node-enumeration-cleanup-fix-01 2003-09-26 22:21:32.000000000 -0700 +++ 25-akpm/include/asm-ia64/numa.h 2003-09-26 22:21:32.000000000 -0700 @@ -16,9 +16,9 @@ #ifdef CONFIG_NUMA -# include - +#include #include + extern volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned; extern volatile cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; diff -puN include/asm-ia64/sn/pda.h~node-enumeration-cleanup-fix-01 include/asm-ia64/sn/pda.h --- 25/include/asm-ia64/sn/pda.h~node-enumeration-cleanup-fix-01 2003-09-26 22:21:32.000000000 -0700 +++ 25-akpm/include/asm-ia64/sn/pda.h 2003-09-26 22:21:32.000000000 -0700 @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include #include diff -puN include/linux/mm.h~node-enumeration-cleanup-fix-01 include/linux/mm.h --- 25/include/linux/mm.h~node-enumeration-cleanup-fix-01 2003-09-26 22:21:32.000000000 -0700 +++ 25-akpm/include/linux/mm.h 2003-09-26 22:21:32.000000000 -0700 @@ -323,7 +323,6 @@ 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. */ -#define NODE_SHIFT 4 #define ZONE_SHIFT (BITS_PER_LONG - 8) struct zone; diff -puN include/linux/mmzone.h~node-enumeration-cleanup-fix-01 include/linux/mmzone.h --- 25/include/linux/mmzone.h~node-enumeration-cleanup-fix-01 2003-09-26 22:21:32.000000000 -0700 +++ 25-akpm/include/linux/mmzone.h 2003-09-26 22:21:32.000000000 -0700 @@ -10,14 +10,8 @@ #include #include #include +#include #include -#ifdef CONFIG_DISCONTIGMEM -#include -#endif -#ifndef NODES_SHIFT -#define NODES_SHIFT 0 -#endif -#define MAX_NUMNODES (1 << NODES_SHIFT) /* Free memory management - zoned buddy allocator. */ #ifndef CONFIG_FORCE_MAX_ZONEORDER @@ -313,12 +307,19 @@ extern struct pglist_data contig_page_da #else /* CONFIG_DISCONTIGMEM */ #include + +#if BITS_PER_LONG == 32 /* - * page->zone is currently 8 bits - * there are 3 zones (2 bits) - * this leaves 8-2=6 bits for nodes + * with 32 bit flags field, page->zone is currently 8 bits. + * there are 3 zones (2 bits) and this leaves 8-2=6 bits for nodes. */ #define MAX_NODES_SHIFT 6 +#elif BITS_PER_LONG == 64 +/* + * with 64 bit flags field, there's plenty of room. + */ +#define MAX_NODES_SHIFT 10 +#endif #endif /* !CONFIG_DISCONTIGMEM */ diff -puN /dev/null include/linux/numa.h --- /dev/null 2002-08-30 16:31:37.000000000 -0700 +++ 25-akpm/include/linux/numa.h 2003-09-26 22:21:32.000000000 -0700 @@ -0,0 +1,16 @@ +#ifndef _LINUX_NUMA_H +#define _LINUX_NUMA_H + +#include + +#ifdef CONFIG_DISCONTIGMEM +#include +#endif + +#ifndef NODES_SHIFT +#define NODES_SHIFT 0 +#endif + +#define MAX_NUMNODES (1 << NODES_SHIFT) + +#endif /* _LINUX_NUMA_H */ _