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/<xxx>/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 <linux/writeback.h>
 
 #include <asm/pgalloc.h>
-#include <asm/uaccess.h>
+#include <linux/uaccess.h>
 #include <asm/tlb.h>
 #include <asm/tlbflush.h>
 #include <asm/pgtable.h>
@@ -60,6 +60,55 @@
 #include <linux/swapops.h>
 #include <linux/elf.h>
 
+#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 <linux/kernel_stat.h>
 #include <linux/string.h>
 #include <linux/init.h>
-#include <linux/bootmem.h>	/* for max_pfn/max_low_pfn */
 #include <linux/completion.h>
 #include <linux/slab.h>
 #include <linux/swap.h>
@@ -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 <asm/page.h>
 EXPORT_SYMBOL(clear_page);
 
-#ifdef CONFIG_VIRTUAL_MEM_MAP
-#include <linux/bootmem.h>
-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 <asm/processor.h>
 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);