From 4520d5b3104970a7b916bb0a92311e77fec9c3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Date: Tue, 24 May 2011 17:12:24 -0700 Subject: [PATCH] --- yaml --- r: 250911 b: refs/heads/master c: 6d3163ce86dd386b4f7bda80241d7fea2bc0bb1d h: refs/heads/master i: 250909: 6b25d0a8e5c6c2ecb78590111895e6aee1906393 250907: 44ebf0e6ef819103de324e13c3e052cc6b38b43e 250903: bab40a45e03a4b4832d0a98b2fff6f9ff52baeee 250895: 3e161ab6c8cf88a49a0d418644c82d034bc3e8b9 250879: 8f06f45f87f73e4995ebd5b68e21f11e9228bb60 v: v3 --- [refs] | 2 +- trunk/mm/page_alloc.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 152effe48aba..c8c91f3d3f4f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0091a47da0b720ca39511c7d90dcc768cafcaf58 +refs/heads/master: 6d3163ce86dd386b4f7bda80241d7fea2bc0bb1d diff --git a/trunk/mm/page_alloc.c b/trunk/mm/page_alloc.c index 44019da9632e..01e6b614839d 100644 --- a/trunk/mm/page_alloc.c +++ b/trunk/mm/page_alloc.c @@ -3328,6 +3328,20 @@ static inline unsigned long wait_table_bits(unsigned long size) #define LONG_ALIGN(x) (((x)+(sizeof(long))-1)&~((sizeof(long))-1)) +/* + * Check if a pageblock contains reserved pages + */ +static int pageblock_is_reserved(unsigned long start_pfn, unsigned long end_pfn) +{ + unsigned long pfn; + + for (pfn = start_pfn; pfn < end_pfn; pfn++) { + if (!pfn_valid_within(pfn) || PageReserved(pfn_to_page(pfn))) + return 1; + } + return 0; +} + /* * Mark a number of pageblocks as MIGRATE_RESERVE. The number * of blocks reserved is based on min_wmark_pages(zone). The memory within @@ -3337,7 +3351,7 @@ static inline unsigned long wait_table_bits(unsigned long size) */ static void setup_zone_migrate_reserve(struct zone *zone) { - unsigned long start_pfn, pfn, end_pfn; + unsigned long start_pfn, pfn, end_pfn, block_end_pfn; struct page *page; unsigned long block_migratetype; int reserve; @@ -3367,7 +3381,8 @@ static void setup_zone_migrate_reserve(struct zone *zone) continue; /* Blocks with reserved pages will never free, skip them. */ - if (PageReserved(page)) + block_end_pfn = min(pfn + pageblock_nr_pages, end_pfn); + if (pageblock_is_reserved(pfn, block_end_pfn)) continue; block_migratetype = get_pageblock_migratetype(page);