From 82fc59c00566fa8f68734ed42084f951c1ff48ab Mon Sep 17 00:00:00 2001 From: Mel Gorman Date: Mon, 21 Sep 2009 17:02:31 -0700 Subject: [PATCH] --- yaml --- r: 164427 b: refs/heads/master c: 2f66a68f3fac2e94da360c342ff78ab45553f86c h: refs/heads/master i: 164425: 38817166d51a9b72ff13ff1f21ce40e5826b9e74 164423: 9839abfd65f61771ece8af9515e4f636012b15b8 v: v3 --- [refs] | 2 +- trunk/mm/page_alloc.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 1aff3560b361..dd15e747b7c2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fe1ff49d0d1c30254dbfc84c3786eb538e0cc7d1 +refs/heads/master: 2f66a68f3fac2e94da360c342ff78ab45553f86c diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index 9242d13f4ff3..20759803a64a 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -783,6 +783,17 @@ static int move_freepages_block(struct zone *zone, struct page *page, return move_freepages(zone, start_page, end_page, migratetype); } +static void change_pageblock_range(struct page *pageblock_page, + int start_order, int migratetype) +{ + int nr_pageblocks = 1 << (start_order - pageblock_order); + + while (nr_pageblocks--) { + set_pageblock_migratetype(pageblock_page, migratetype); + pageblock_page += pageblock_nr_pages; + } +} + /* Remove an element from the buddy allocator from the fallback list */ static inline struct page * __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) @@ -836,8 +847,9 @@ __rmqueue_fallback(struct zone *zone, int order, int start_migratetype) list_del(&page->lru); rmv_page_order(page); - if (current_order == pageblock_order) - set_pageblock_migratetype(page, + /* Take ownership for orders >= pageblock_order */ + if (current_order >= pageblock_order) + change_pageblock_range(page, current_order, start_migratetype); expand(zone, page, order, current_order, area, migratetype);