From: Bradley Christiansen This patch abstracts the actual act of marking pages used, in the page allocator. It needs to be broken out so that another function, walking the free lists by physical address may also remove pages. Uses extract_pages() in rmqueue(). An additional user will be in the next patch Fixed up merge problem with Nick's large order freeing patch. Signed-off-by: Dave Hansen --- memhotplug-dave/mm/page_alloc.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) diff -puN mm/page_alloc.c~K0-removal-extract_pages mm/page_alloc.c --- memhotplug/mm/page_alloc.c~K0-removal-extract_pages 2005-07-28 13:51:09.000000000 -0700 +++ memhotplug-dave/mm/page_alloc.c 2005-07-28 13:51:09.000000000 -0700 @@ -389,6 +389,16 @@ free_pages_bulk(struct zone *zone, int c return ret; } +static inline void extract_pages(struct page *page, struct zone *zone, + unsigned int order, struct free_area *area) +{ + list_del(&page->lru); + /* this is guarded by zone->lock */ + rmv_page_order(page); + zone->free_pages -= 1UL << order; + area->nr_free--; +} + void __free_pages_ok(struct page *page, unsigned int order) { LIST_HEAD(list); @@ -505,10 +515,7 @@ static struct page *__rmqueue(struct zon continue; page = list_entry(area->free_list.next, struct page, lru); - list_del(&page->lru); - rmv_page_order(page); - area->nr_free--; - zone->free_pages -= 1UL << order; + extract_pages(page, zone, order, area); return expand(zone, page, order, current_order, area); } _