aboutsummaryrefslogtreecommitdiffstats
path: root/mm/hugetlb.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/hugetlb.c')
-rw-r--r--mm/hugetlb.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index e6afe527bd09..d143ab67be44 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -491,6 +491,8 @@ static void update_and_free_page(struct hstate *h, struct page *page)
491{ 491{
492 int i; 492 int i;
493 493
494 VM_BUG_ON(h->order >= MAX_ORDER);
495
494 h->nr_huge_pages--; 496 h->nr_huge_pages--;
495 h->nr_huge_pages_node[page_to_nid(page)]--; 497 h->nr_huge_pages_node[page_to_nid(page)]--;
496 for (i = 0; i < pages_per_huge_page(h); i++) { 498 for (i = 0; i < pages_per_huge_page(h); i++) {
@@ -1005,6 +1007,14 @@ found:
1005 return 1; 1007 return 1;
1006} 1008}
1007 1009
1010static void prep_compound_huge_page(struct page *page, int order)
1011{
1012 if (unlikely(order > (MAX_ORDER - 1)))
1013 prep_compound_gigantic_page(page, order);
1014 else
1015 prep_compound_page(page, order);
1016}
1017
1008/* Put bootmem huge pages into the standard lists after mem_map is up */ 1018/* Put bootmem huge pages into the standard lists after mem_map is up */
1009static void __init gather_bootmem_prealloc(void) 1019static void __init gather_bootmem_prealloc(void)
1010{ 1020{
@@ -1015,7 +1025,7 @@ static void __init gather_bootmem_prealloc(void)
1015 struct hstate *h = m->hstate; 1025 struct hstate *h = m->hstate;
1016 __ClearPageReserved(page); 1026 __ClearPageReserved(page);
1017 WARN_ON(page_count(page) != 1); 1027 WARN_ON(page_count(page) != 1);
1018 prep_compound_page(page, h->order); 1028 prep_compound_huge_page(page, h->order);
1019 prep_new_huge_page(h, page, page_to_nid(page)); 1029 prep_new_huge_page(h, page, page_to_nid(page));
1020 } 1030 }
1021} 1031}