diff -r bbabdebc54ad xen/common/page_alloc.c --- a/xen/common/page_alloc.c Wed Jul 19 21:13:36 2006 +0100 +++ b/xen/common/page_alloc.c Fri Aug 04 22:52:23 2006 -0400 @@ -256,7 +256,7 @@ void end_boot_allocator(void) void end_boot_allocator(void) { unsigned long i, j; - int curr_free = 0, next_free = 0; + int curr_free, prev_free; memset(avail, 0, sizeof(avail)); @@ -265,15 +265,18 @@ void end_boot_allocator(void) INIT_LIST_HEAD(&heap[i][j]); /* Pages that are free now go to the domain sub-allocator. */ - for ( i = 0; i < max_page; i++ ) - { - curr_free = next_free; - next_free = !allocated_in_map(i+1); - if ( next_free ) - map_alloc(i+1, 1); /* prevent merging in free_heap_pages() */ + prev_free = !allocated_in_map(0); + for ( i = 1; i < max_page; i++ ) + { + curr_free = !allocated_in_map(i); if ( curr_free ) - free_heap_pages(pfn_dom_zone_type(i), mfn_to_page(i), 0); - } + map_alloc(i, 1); /* prevent merging in free_heap_pages() */ + if ( prev_free ) + free_heap_pages(pfn_dom_zone_type(i-1), mfn_to_page(i-1), 0); + prev_free = curr_free; + } + if ( prev_free ) + free_heap_pages(pfn_dom_zone_type(i-1), mfn_to_page(i-1), 0); } /* Hand the specified arbitrary page range to the specified heap zone. */