Index: linux-2.6.19-rc1-mm1/include/asm-ia64/page.h =================================================================== --- linux-2.6.19-rc1-mm1.orig/include/asm-ia64/page.h 2006-10-12 23:52:15.071818769 -0500 +++ linux-2.6.19-rc1-mm1/include/asm-ia64/page.h 2006-10-12 23:54:26.352578322 -0500 @@ -97,18 +97,10 @@ do { \ #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE -#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) -#ifdef CONFIG_VIRTUAL_MEM_MAP -extern int ia64_pfn_valid (unsigned long pfn); -#elif defined(CONFIG_FLATMEM) -# define ia64_pfn_valid(pfn) 1 -#endif - -#ifdef CONFIG_VIRTUAL_MEM_MAP -#define page_to_pfn(page) ((unsigned long) (page - mem_map)) -#define pfn_to_page(pfn) (mem_map + (pfn)) -#endif +#if defined(CONFIG_VIRTUAL_MEM_MAP) || defined(CONFIG_FLATMEM) +#define STANDARD_MEM_MAP +#else #if defined(CONFIG_FLATMEM) || defined(CONFIG_SPARSEMEM) /* FLATMEM always configures mem_map (mem_map = vmem_map if necessary) */ @@ -118,14 +110,10 @@ extern int ia64_pfn_valid (unsigned long #ifdef CONFIG_FLATMEM # define pfn_valid(pfn) (((pfn) < max_mapnr) && ia64_pfn_valid(pfn)) #elif defined(CONFIG_DISCONTIGMEM) -extern unsigned long min_low_pfn; extern unsigned long max_low_pfn; # define pfn_valid(pfn) (((pfn) >= min_low_pfn) && ((pfn) < max_low_pfn) && ia64_pfn_valid(pfn)) #endif - -#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) -#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) -#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) +#endif typedef union ia64_va { struct { Index: linux-2.6.19-rc1-mm1/include/linux/mm.h =================================================================== --- linux-2.6.19-rc1-mm1.orig/include/linux/mm.h 2006-10-12 23:52:15.079631937 -0500 +++ linux-2.6.19-rc1-mm1/include/linux/mm.h 2006-10-12 23:59:14.192523499 -0500 @@ -21,17 +21,39 @@ struct mempolicy; struct anon_vma; -#ifndef CONFIG_DISCONTIGMEM /* Don't use mapnrs, do it properly */ -extern unsigned long max_mapnr; -#endif - +#ifdef CONFIG_STANDARD_MEM_MAP #ifdef CONFIG_VIRTUAL_MEM_MAP /* * Memory map at a fixed address that can be used to realize basic * VM address conversions without a single memory access, - * can be sparsely populated and span multiple NUMA nodes. + * can be sparsely populated and span multiple NUMA nodes if + * mapped via a page table. mem_map is defined in + * arch//kernel/vmlinux.lds */ extern struct page mem_map[]; +#ifndef VIRTUAL_MEM_MAP_PAGE_SIZE +#define VIRTUAL_MEM_MAP_PAGE_SIZE PAGE_SIZE +#define VIRTUAL_MEM_MAP_PAGE_SHIFT PAGE_SHIFT +#endif +#else +/* + * Memory map at a dynamic configurable memory address. + * This will require one memory access for each conversion + * but allows arbitrary placement. + */ +extern struct page *mem_map; +#endif + +/* + * Basic conversions between physical addresses and page struct pointers. + */ +#define page_to_pfn(page) ((unsigned long) ((page) - mem_map)) +#define pfn_to_page(pfn) (mem_map + (pfn)) +#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) +#define pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) +#define phys_to_pfn(addr) ((addr) >> PAGE_SHIFT) +#define phys_to_page(addr) pfn_to_page(phys_to_pfn(addr)) + #endif extern unsigned long num_physpages; @@ -52,6 +74,40 @@ extern int sysctl_legacy_va_layout; #define nth_page(page,n) pfn_to_page(page_to_pfn((page)) + (n)) /* + * These are initialized through MEM_MAP_MIN and MEM_MAP_MAX that need to be + * defined in asm/page.h. They can be modified on bootup to reflect actually + * present pages. + */ +extern unsigned long mem_map_min; +extern unsigned long mem_map_max; + +/* If we have highmem then we may have an additional boundary */ +#ifdef CONFIG_HIGHMEM +extern unsigned long mem_map_high; +#else +#define mem_map_high mem_map_max +#endif + +#ifdef CONFIG_STANDARD_MEM_MAP +/* + * Basic conversion between struct page and usable address pointers + */ +#define pfn_to_kaddr(pfn) __va(pfn_to_phys(pfn)) +#define kaddr_to_pfn(addr) phys_to_pfn(__pa(addr)) +#define virt_addr_valid(kaddr) pfn_valid(kaddr_to_pfn(kaddr)) +#define virt_to_page(kaddr) pfn_to_page(kaddr_to_pfn(kaddr)) + +#ifdef CONFIG_VIRTUAL_MEM_MAP +extern int pfn_valid(unsigned long pfn); +#else +static inline int pfn_valid(unsigned long pfn) +{ + return pfn >= mem_map_min && pfn <= mem_map_max; +} +#endif +#endif /* STANDARD_MEM_MAP */ + +/* * Linux kernel virtual memory manager primitives. * The idea being to have a "virtual" mm in the same way * we have a virtual fs - giving a cleaner interface to the @@ -525,7 +581,7 @@ static inline void set_page_links(struct static __always_inline void *lowmem_page_address(struct page *page) { - return __va(page_to_pfn(page) << PAGE_SHIFT); + return __va(page_to_phys(page)); } #if defined(CONFIG_HIGHMEM) && !defined(WANT_PAGE_VIRTUAL) Index: linux-2.6.19-rc1-mm1/mm/memory.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/mm/memory.c 2006-10-12 23:52:15.105024734 -0500 +++ linux-2.6.19-rc1-mm1/mm/memory.c 2006-10-13 00:16:35.330980428 -0500 @@ -52,7 +52,7 @@ #include #include -#include +#include #include #include #include @@ -60,6 +60,55 @@ #include #include +#ifndef CONFIG_HAVE_MAPPED_ADDRESS +static inline int mapped_address(void *x) +{ + u8 yy; + + return probe_kernel_address(x, yy) == 0; +} +#endif + + +#ifndef MEM_MAP_MIN +#define MEM_MAP_MIN 0 +#endif + +#ifndef MEM_MAP_MAX +#define MEM_MAP_MAX (1UL << (BITS_PER_LONG - PAGE_SHIFT)) +#endif + +unsigned long mem_map_min = MEM_MAP_MIN; +unsigned long mem_map_max = MEM_MAP_MAX; + +#ifdef CONFIG_VIRTUAL_MEM_MAP +int pfn_valid(unsigned long pfn) +{ + struct page *page; + + if ((pfn) < mem_map_min && (pfn) >= mem_map_max) + return 0; + + page = pfn_to_page(pfn); + if (!mapped_address(page)) + return 0; + + /* + * Check boundary condition when a page struct may cross a page + * boundary of the virtual memory map. This is going to optimize + * out in case struct pages fit exactly into a page. + */ + if (VIRTUAL_MEM_MAP_PAGE_SIZE % sizeof(struct page) && + ((__pa(page) >> VIRTUAL_MEM_MAP_PAGE_SHIFT) != + (__pa((void *)(page + 1) - 1) << VIRTUAL_MEM_MAP_PAGE_SHIFT)) && + !mapped_address((void *)(page + 1) - 1)) + return 0; + + return 1; +} +EXPORT_SYMBOL(pfn_valid); +#endif + #ifndef CONFIG_NEED_MULTIPLE_NODES /* use the per-pgdat data instead for discontigmem - mbligh */ unsigned long max_mapnr; Index: linux-2.6.19-rc1-mm1/block/ll_rw_blk.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/block/ll_rw_blk.c 2006-10-12 23:52:15.130417531 -0500 +++ linux-2.6.19-rc1-mm1/block/ll_rw_blk.c 2006-10-12 23:52:38.912724874 -0500 @@ -20,7 +20,6 @@ #include #include #include -#include /* for max_pfn/max_low_pfn */ #include #include #include @@ -639,7 +638,7 @@ void blk_queue_bounce_limit(request_queu know of a way to test this here. */ if (bounce_pfn < (min_t(u64,0xffffffff,BLK_BOUNCE_HIGH) >> PAGE_SHIFT)) dma = 1; - q->bounce_pfn = max_low_pfn; + q->bounce_pfn = mem_map_high; #else if (bounce_pfn < blk_max_low_pfn) dma = 1; @@ -3650,8 +3649,8 @@ int __init blk_dev_init(void) open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL); register_hotcpu_notifier(&blk_cpu_notifier); - blk_max_low_pfn = max_low_pfn; - blk_max_pfn = max_pfn; + blk_max_low_pfn = mem_map_high; + blk_max_pfn = mem_map_max; return 0; } Index: linux-2.6.19-rc1-mm1/init/main.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/init/main.c 2006-10-12 23:52:15.138230699 -0500 +++ linux-2.6.19-rc1-mm1/init/main.c 2006-10-12 23:52:38.927374564 -0500 @@ -562,9 +562,9 @@ asmlinkage void __init start_kernel(void #ifdef CONFIG_BLK_DEV_INITRD if (initrd_start && !initrd_below_start_ok && - initrd_start < min_low_pfn << PAGE_SHIFT) { + initrd_start < pfn_to_phys(mem_map_min)) { printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - " - "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT); + "disabling it.\n",initrd_start,pfn_to_phys(mem_map_min)); initrd_start = 0; } #endif Index: linux-2.6.19-rc1-mm1/mm/bootmem.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/mm/bootmem.c 2006-10-12 23:52:15.112837902 -0500 +++ linux-2.6.19-rc1-mm1/mm/bootmem.c 2006-10-12 23:52:38.937141025 -0500 @@ -23,11 +23,6 @@ * Access to this subsystem has to be serialized externally. (this is * true for the boot process anyway) */ -unsigned long max_low_pfn; -unsigned long min_low_pfn; -unsigned long max_pfn; - -EXPORT_UNUSED_SYMBOL(max_pfn); /* June 2006 */ static LIST_HEAD(bdata_list); #ifdef CONFIG_CRASH_DUMP @@ -390,8 +385,8 @@ unsigned long __init free_all_bootmem_no unsigned long __init init_bootmem(unsigned long start, unsigned long pages) { - max_low_pfn = pages; - min_low_pfn = start; + mem_map_high = pages; + mem_map_min = start; return init_bootmem_core(NODE_DATA(0), start, 0, pages); } Index: linux-2.6.19-rc1-mm1/arch/alpha/mm/numa.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/alpha/mm/numa.c 2006-10-12 23:52:15.148973805 -0500 +++ linux-2.6.19-rc1-mm1/arch/alpha/mm/numa.c 2006-10-12 23:52:38.953744007 -0500 @@ -122,8 +122,8 @@ setup_memory_node(int nid, void *kernel_ return; /* Update global {min,max}_low_pfn from node information. */ - if (node_min_pfn < min_low_pfn) - min_low_pfn = node_min_pfn; + if (node_min_pfn < mem_map_min) + mem_map_min = node_min_pfn; if (node_max_pfn > max_low_pfn) max_pfn = max_low_pfn = node_max_pfn; @@ -255,7 +255,7 @@ setup_memory(void *kernel_end) nodes_clear(node_online_map); - min_low_pfn = ~0UL; + mem_map_min = ~0UL; max_low_pfn = 0UL; for (nid = 0; nid < MAX_NUMNODES; nid++) setup_memory_node(nid, kernel_end); Index: linux-2.6.19-rc1-mm1/arch/cris/kernel/setup.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/cris/kernel/setup.c 2006-10-12 23:52:15.157763619 -0500 +++ linux-2.6.19-rc1-mm1/arch/cris/kernel/setup.c 2006-10-12 23:52:38.968393698 -0500 @@ -99,7 +99,7 @@ setup_arch(char **cmdline_p) */ start_pfn = PFN_UP(memory_start); /* usually c0000000 + kernel + romfs */ - max_pfn = PFN_DOWN((unsigned long)high_memory); /* usually c0000000 + dram size */ + mem_map_max = PFN_DOWN((unsigned long)high_memory); /* usually c0000000 + dram size */ /* * Initialize the boot-time allocator (start, end) @@ -117,12 +117,12 @@ setup_arch(char **cmdline_p) * because our map starts at a quite high address (min_low_pfn). */ - max_low_pfn = max_pfn; - min_low_pfn = PAGE_OFFSET >> PAGE_SHIFT; + mem_map_high = mem_map_max; + mem_map_min = PAGE_OFFSET >> PAGE_SHIFT; bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn, - min_low_pfn, - max_low_pfn); + mem_map_min, + mem_map_high); /* And free all memory not belonging to the kernel (addr, size) */ Index: linux-2.6.19-rc1-mm1/arch/cris/mm/init.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/cris/mm/init.c 2006-10-12 23:52:15.166553433 -0500 +++ linux-2.6.19-rc1-mm1/arch/cris/mm/init.c 2006-10-12 23:52:38.979136804 -0500 @@ -176,7 +176,7 @@ mem_init(void) * high_memory was also set in setup.c */ - max_mapnr = num_physpages = max_low_pfn - min_low_pfn; + max_mapnr = num_physpages = max_low_pfn - mem_map_min; /* this will put all memory onto the freelists */ totalram_pages = free_all_bootmem(); Index: linux-2.6.19-rc1-mm1/arch/frv/kernel/setup.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/frv/kernel/setup.c 2006-10-12 23:52:15.175343248 -0500 +++ linux-2.6.19-rc1-mm1/arch/frv/kernel/setup.c 2006-10-12 23:52:38.994763140 -0500 @@ -924,9 +924,9 @@ static void __init setup_linux_memory(vo low_top_pfn = num_physpages; } - min_low_pfn = memory_start >> PAGE_SHIFT; + mem_map_min = phys_to_pfn(memory_start); max_low_pfn = low_top_pfn; - max_pfn = memory_end >> PAGE_SHIFT; + mem_map_max = phys_to_pfn(memory_end); num_mappedpages = low_top_pfn; @@ -995,9 +995,9 @@ static void __init setup_uclinux_memory( high_memory = (void *) (memory_end & PAGE_MASK); max_mapnr = num_physpages = ((unsigned long) high_memory - PAGE_OFFSET) >> PAGE_SHIFT; - min_low_pfn = memory_start >> PAGE_SHIFT; - max_low_pfn = memory_end >> PAGE_SHIFT; - max_pfn = max_low_pfn; + mem_map_min = phys_to_pfn(memory_start); + mem_map_high = phys_to_pfn(memory_end); + mem_map_max = mem_map_high; /* now take back the bits the core kernel is occupying */ #ifndef CONFIG_PROTECT_KERNEL Index: linux-2.6.19-rc1-mm1/arch/frv/mm/init.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/frv/mm/init.c 2006-10-12 23:52:15.185109708 -0500 +++ linux-2.6.19-rc1-mm1/arch/frv/mm/init.c 2006-10-12 23:52:39.007459539 -0500 @@ -126,7 +126,7 @@ void __init paging_init(void) /* distribute the allocatable pages across the various zones and pass them to the allocator */ - zones_size[ZONE_DMA] = max_low_pfn - min_low_pfn; + zones_size[ZONE_DMA] = mem_map_high - mem_map_min; zones_size[ZONE_NORMAL] = 0; #ifdef CONFIG_HIGHMEM zones_size[ZONE_HIGHMEM] = num_physpages - num_mappedpages; Index: linux-2.6.19-rc1-mm1/arch/i386/kernel/setup.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/i386/kernel/setup.c 2006-10-12 23:52:15.194876168 -0500 +++ linux-2.6.19-rc1-mm1/arch/i386/kernel/setup.c 2006-10-12 23:52:39.025039167 -0500 @@ -1067,16 +1067,16 @@ static unsigned long __init setup_memory * partially used pages are not usable - thus * we are rounding upwards: */ - min_low_pfn = PFN_UP(init_pg_tables_end); + mem_map_min = PFN_UP(init_pg_tables_end); find_max_pfn(); - max_low_pfn = find_max_low_pfn(); + mem_map_high = find_max_low_pfn(); #ifdef CONFIG_HIGHMEM highstart_pfn = highend_pfn = max_pfn; - if (max_pfn > max_low_pfn) { - highstart_pfn = max_low_pfn; + if (mem_map_max > mem_map_high) { + highstart_pfn = mem_map_high; } printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", pages_to_mb(highend_pfn - highstart_pfn)); @@ -1087,14 +1087,14 @@ static unsigned long __init setup_memory high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1; #endif #ifdef CONFIG_FLATMEM - max_mapnr = num_physpages; + mem_map_max = num_physpages; #endif printk(KERN_NOTICE "%ldMB LOWMEM available.\n", pages_to_mb(max_low_pfn)); setup_bootmem_allocator(); - return max_low_pfn; + return mem_map_high; } void __init zone_sizes_init(void) @@ -1124,7 +1124,7 @@ void __init setup_bootmem_allocator(void /* * Initialize the boot-time allocator (with low memory only): */ - bootmap_size = init_bootmem(min_low_pfn, max_low_pfn); + bootmap_size = init_bootmem(mem_map_min, mem_map_high); register_bootmem_low_pages(max_low_pfn); @@ -1134,7 +1134,7 @@ void __init setup_bootmem_allocator(void * the (very unlikely) case of us accidentally initializing the * bootmem allocator with an invalid RAM area. */ - reserve_bootmem(__PHYSICAL_START, (PFN_PHYS(min_low_pfn) + + reserve_bootmem(__PHYSICAL_START, (PFN_PHYS(mem_map_min) + bootmap_size + PAGE_SIZE-1) - (__PHYSICAL_START)); /* @@ -1176,7 +1176,7 @@ void __init setup_bootmem_allocator(void numa_kva_reserve(); #ifdef CONFIG_BLK_DEV_INITRD if (LOADER_TYPE && INITRD_START) { - if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { + if (INITRD_START + INITRD_SIZE <= (mem_map_high << PAGE_SHIFT)) { reserve_bootmem(INITRD_START, INITRD_SIZE); initrd_start = INITRD_START ? INITRD_START + PAGE_OFFSET : 0; @@ -1186,7 +1186,7 @@ void __init setup_bootmem_allocator(void printk(KERN_ERR "initrd extends beyond end of memory " "(0x%08lx > 0x%08lx)\ndisabling initrd\n", INITRD_START + INITRD_SIZE, - max_low_pfn << PAGE_SHIFT); + mem_map_high << PAGE_SHIFT); initrd_start = 0; } } Index: linux-2.6.19-rc1-mm1/fs/proc/proc_misc.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/fs/proc/proc_misc.c 2006-10-12 23:52:15.219292319 -0500 +++ linux-2.6.19-rc1-mm1/fs/proc/proc_misc.c 2006-10-12 23:52:39.042618796 -0500 @@ -675,7 +675,7 @@ read_page_owner(struct file *file, char int i; ssize_t num_written = 0; - pfn = min_low_pfn + *ppos; + pfn = mem_map_min + *ppos; page = pfn_to_page(pfn); for (; pfn < max_pfn; pfn++) { if (!pfn_valid(pfn)) Index: linux-2.6.19-rc1-mm1/include/asm-frv/page.h =================================================================== --- linux-2.6.19-rc1-mm1.orig/include/asm-frv/page.h 2006-10-12 23:52:15.098188212 -0500 +++ linux-2.6.19-rc1-mm1/include/asm-frv/page.h 2006-10-12 23:52:39.054338548 -0500 @@ -52,14 +52,13 @@ typedef struct { unsigned long pgprot; } #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) extern unsigned long max_low_pfn; -extern unsigned long min_low_pfn; extern unsigned long max_pfn; #ifdef CONFIG_MMU #define pfn_valid(pfn) ((pfn) < max_mapnr) #else #define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT) -#define pfn_valid(pfn) ((pfn) >= min_low_pfn && (pfn) < max_low_pfn) +#define pfn_valid(pfn) ((pfn) >= mem_map_min && (pfn) < max_low_pfn) #endif Index: linux-2.6.19-rc1-mm1/include/linux/bootmem.h =================================================================== --- linux-2.6.19-rc1-mm1.orig/include/linux/bootmem.h 2006-10-12 23:52:15.088421752 -0500 +++ linux-2.6.19-rc1-mm1/include/linux/bootmem.h 2006-10-12 23:52:39.062151716 -0500 @@ -12,7 +12,6 @@ */ extern unsigned long max_low_pfn; -extern unsigned long min_low_pfn; /* * highest page Index: linux-2.6.19-rc1-mm1/arch/ia64/kernel/ia64_ksyms.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/ia64/kernel/ia64_ksyms.c 2006-10-12 23:52:15.206595920 -0500 +++ linux-2.6.19-rc1-mm1/arch/ia64/kernel/ia64_ksyms.c 2006-10-13 00:00:25.247395378 -0500 @@ -24,12 +24,6 @@ EXPORT_SYMBOL(__up); #include EXPORT_SYMBOL(clear_page); -#ifdef CONFIG_VIRTUAL_MEM_MAP -#include -EXPORT_SYMBOL(min_low_pfn); /* defined by bootmem.c, but not exported by generic code */ -EXPORT_SYMBOL(max_low_pfn); /* defined by bootmem.c, but not exported by generic code */ -#endif - #include EXPORT_SYMBOL(per_cpu__cpu_info); #ifdef CONFIG_SMP Index: linux-2.6.19-rc1-mm1/arch/ia64/mm/contig.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/ia64/mm/contig.c 2006-10-12 23:52:33.227668358 -0500 +++ linux-2.6.19-rc1-mm1/arch/ia64/mm/contig.c 2006-10-12 23:54:35.388507488 -0500 @@ -45,8 +45,8 @@ show_mem (void) printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); - i = max_mapnr; - for (i = 0; i < max_mapnr; i++) { + i = mem_map_max; + for (i = 0; i < mem_map_max; i++) { if (!pfn_valid(i)) { #ifdef CONFIG_VIRTUAL_MEM_MAP if (max_gap < LARGE_GAP) @@ -237,7 +237,7 @@ paging_init (void) max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; max_zone_pfns[ZONE_DMA] = max_dma; #endif - max_zone_pfns[ZONE_NORMAL] = max_low_pfn; + max_zone_pfns[ZONE_NORMAL] = mem_map_min; #ifdef CONFIG_VIRTUAL_MEM_MAP efi_memmap_walk(register_active_ranges, &nid); @@ -252,7 +252,7 @@ paging_init (void) printk("Virtual mem_map starts at 0x%p\n", mem_map); } #else /* !CONFIG_VIRTUAL_MEM_MAP */ - add_active_range(0, 0, max_low_pfn); + add_active_range(0, 0, mem_map_max); free_area_init_nodes(max_zone_pfns); #endif /* !CONFIG_VIRTUAL_MEM_MAP */ zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page)); Index: linux-2.6.19-rc1-mm1/arch/ia64/mm/discontig.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/ia64/mm/discontig.c 2006-10-12 23:52:33.216925252 -0500 +++ linux-2.6.19-rc1-mm1/arch/ia64/mm/discontig.c 2006-10-12 23:54:35.409993701 -0500 @@ -88,8 +88,8 @@ static int __init build_node_maps(unsign bdp->node_low_pfn = max(epfn, bdp->node_low_pfn); } - min_low_pfn = min(min_low_pfn, bdp->node_boot_start>>PAGE_SHIFT); - max_low_pfn = max(max_low_pfn, bdp->node_low_pfn); + mem_map_min = min(mem_map_min, bdp->node_boot_start>>PAGE_SHIFT); + mem_map_max = max(mem_map_max, bdp->node_low_pfn); return 0; } @@ -463,8 +463,8 @@ void __init find_memory(void) } nodes_or(memory_less_mask, memory_less_mask, node_online_map); - min_low_pfn = -1; - max_low_pfn = 0; + mem_map_min = -1; + mem_map_max = 0; /* These actually end up getting called by call_pernode_memory() */ efi_memmap_walk(filter_rsvd_memory, build_node_maps); @@ -505,8 +505,6 @@ void __init find_memory(void) memory_less_nodes(); initialize_pernode_data(); - max_pfn = max_low_pfn; - find_initrd(); } Index: linux-2.6.19-rc1-mm1/arch/ia64/Kconfig =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/ia64/Kconfig 2006-10-12 23:54:26.280306515 -0500 +++ linux-2.6.19-rc1-mm1/arch/ia64/Kconfig 2006-10-12 23:58:38.777402262 -0500 @@ -406,6 +406,10 @@ config VIRTUAL_MEM_MAP_HUGE then also change the base page size for the virtual memory map. Too high huge page sizes may lead to memory being wasted. +config STANDARD_MEM_MAP + bool + default y if VIRTUAL_MEM_MAP || FLATMEM + config HOLES_IN_ZONE bool default y if VIRTUAL_MEM_MAP Index: linux-2.6.19-rc1-mm1/arch/ia64/mm/init.c =================================================================== --- linux-2.6.19-rc1-mm1.orig/arch/ia64/mm/init.c 2006-10-12 23:54:26.306675958 -0500 +++ linux-2.6.19-rc1-mm1/arch/ia64/mm/init.c 2006-10-12 23:54:35.398273949 -0500 @@ -674,12 +674,11 @@ mem_init (void) #ifdef CONFIG_FLATMEM if (!mem_map) BUG(); - max_mapnr = max_low_pfn; #endif - high_memory = __va(max_low_pfn * PAGE_SIZE); + high_memory = __va(mem_map_max * PAGE_SIZE); - kclist_add(&kcore_mem, __va(0), max_low_pfn * PAGE_SIZE); + kclist_add(&kcore_mem, __va(0), mem_map_max * PAGE_SIZE); kclist_add(&kcore_vmem, (void *)VMALLOC_START, VMALLOC_END-VMALLOC_START); kclist_add(&kcore_kernel, _stext, _end - _stext);