summaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorYinghai Lu <yinghai@kernel.org>2013-08-01 16:31:18 +1000
committerStephen Rothwell <sfr@canb.auug.org.au>2013-08-01 16:31:18 +1000
commit7ede6a5aff750d21c868a695ebd27636fd48f5d2 (patch)
treee94145d6330886e16f6d0c9e85184ea12a324a1b /mm
parent999bd7c04d1aa0d5888db2fe4aa4b976c1893c74 (diff)
mm: kill one if loop in __free_pages_bootmem()
We should not check loop+1 with loop end in loop body. Just duplicate two lines code to avoid it. That will help a bit when we have huge amount of pages on system with 16TiB memory. Signed-off-by: Yinghai Lu <yinghai@kernel.org> Cc: Mel Gorman <mgorman@suse.de> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/page_alloc.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 670ca21e8281..bf9d7c1074fb 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -751,19 +751,19 @@ static void __free_pages_ok(struct page *page, unsigned int order)
void __init __free_pages_bootmem(struct page *page, unsigned int order)
{
unsigned int nr_pages = 1 << order;
+ struct page *p = page;
unsigned int loop;
- prefetchw(page);
- for (loop = 0; loop < nr_pages; loop++) {
- struct page *p = &page[loop];
-
- if (loop + 1 < nr_pages)
- prefetchw(p + 1);
+ prefetchw(p);
+ for (loop = 0; loop < (nr_pages - 1); loop++, p++) {
+ prefetchw(p + 1);
__ClearPageReserved(p);
set_page_count(p, 0);
}
+ __ClearPageReserved(p);
+ set_page_count(p, 0);
- page_zone(page)->managed_pages += 1 << order;
+ page_zone(page)->managed_pages += nr_pages;
set_page_refcounted(page);
__free_pages(page, order);
}