--- 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); _