

---

 memhotplug-dave/mm/bootmem.c    |   38 ++++++++++++++++++++++++++++++++++++--
 memhotplug-dave/mm/page_alloc.c |    6 +-----
 memhotplug-dave/mm/sparse.c     |    2 ++
 3 files changed, 39 insertions(+), 7 deletions(-)

diff -puN mm/bootmem.c~sparse-noncontig-bootmem mm/bootmem.c
--- memhotplug/mm/bootmem.c~sparse-noncontig-bootmem	2005-04-11 16:12:01.000000000 -0700
+++ memhotplug-dave/mm/bootmem.c	2005-04-11 17:08:50.000000000 -0700
@@ -255,8 +255,8 @@ found:
 
 static unsigned long __init free_all_bootmem_core(pg_data_t *pgdat)
 {
-	struct page *page;
-	unsigned long pfn;
+	struct page *page, *lastpage;
+	unsigned long pfn, lpfn;
 	bootmem_data_t *bdata = pgdat->bdata;
 	unsigned long i, count, total = 0;
 	unsigned long idx;
@@ -289,6 +289,40 @@ static unsigned long __init free_all_boo
 
 		if ((pfn & ((1 << MAX_ORDER) - 1)) == 0)
 			page = pfn_to_page(pfn);
+		if (page != pfn_to_page(pfn)) {
+			printk("%s()\n", __func__);
+			printk("i: %d\n", i);
+			printk("idx: %d\n", idx);
+			printk("page: %p\n", page);
+			printk(" ptp: %p\n", pfn_to_page(pfn));
+			printk(" pfn: %016Lx\n", pfn);
+			printk("MAX_ORDER: %d\n", MAX_ORDER);
+			printk("1 << MAX_ORDER: %d\n", (1 << MAX_ORDER));
+			printk("(1 << MAX_ORDER) -1: %d\n", (1 << MAX_ORDER));
+			printk("1 << MAX_ORDER x: %x\n", (1 << MAX_ORDER));
+			printk("(1 << MAX_ORDER) -1 x: %x\n", (1 << MAX_ORDER)-1);
+			printk("pfn & ((1 << MAX_ORDER) - 1): %016Lx\n",
+					pfn & ((1 << MAX_ORDER) - 1));
+
+			printk("\n");
+			printk("lastpage: %p\n", lastpage);
+			printk(" lptp: %p\n", pfn_to_page(lpfn));
+			printk(" lpfn: %016Lx\n", lpfn);
+			printk("MAX_ORDER: %d\n", MAX_ORDER);
+			printk("1 << MAX_ORDER: %d\n", (1 << MAX_ORDER));
+			printk("(1 << MAX_ORDER) -1: %d\n", (1 << MAX_ORDER)-1);
+			printk("1 << MAX_ORDER x: %x\n", (1 << MAX_ORDER));
+			printk("(1 << MAX_ORDER) -1 x: %x\n", (1 << MAX_ORDER)-1);
+			printk("lpfn & ((1 << MAX_ORDER) - 1): %016Lx\n",
+					(lpfn) & ((1 << MAX_ORDER) - 1));
+			printk("\n");
+			printk("__pfn_to_section(pfn): %d\n", __section_nr(__pfn_to_section(pfn)));
+			printk("__pfn_to_section(lpfn): %d\n", __section_nr(__pfn_to_section(lpfn)));
+			printk("\n");
+			BUG();
+		}
+		lastpage = page;
+		lpfn = pfn;
 
 		if (gofast && v == ~0UL) {
 			int j, order;
diff -puN mm/sparse.c~sparse-noncontig-bootmem mm/sparse.c
--- memhotplug/mm/sparse.c~sparse-noncontig-bootmem	2005-04-11 16:27:15.000000000 -0700
+++ memhotplug-dave/mm/sparse.c	2005-04-11 16:29:12.000000000 -0700
@@ -94,6 +94,8 @@ static struct page *sparse_early_mem_map
 
 	map = alloc_bootmem_node(NODE_DATA(nid),
 			sizeof(struct page) * PAGES_PER_SECTION);
+	alloc_bootmem_node(NODE_DATA(nid),
+			100000);
 	if (map)
 		return map;
 
diff -puN mm/page_alloc.c~sparse-noncontig-bootmem mm/page_alloc.c
--- memhotplug/mm/page_alloc.c~sparse-noncontig-bootmem	2005-04-11 16:49:11.000000000 -0700
+++ memhotplug-dave/mm/page_alloc.c	2005-04-11 17:01:11.000000000 -0700
@@ -1814,15 +1814,11 @@ void __devinit memmap_init_zone(unsigned
 	int end_pfn = start_pfn + size;
 	int pfn;
 
-	/*
-	 * Make use of the guarentee that *_mem_map will be
-	 * contigious in sections aligned at MAX_ORDER.
-	 */
 	page = pfn_to_page(start_pfn);
 	for (pfn = start_pfn; pfn < end_pfn; pfn++, page++) {
 		if (!early_pfn_valid(pfn))
 			continue;
-		if ((pfn & ((1 << MAX_ORDER) - 1)) == 0)
+		if ((pfn & ((1 << (MAX_ORDER-1)) - 1)) == 0)
 			page = pfn_to_page(pfn);
 		set_page_links(page, zone, nid, pfn);
 		set_page_count(page, 0);
_
