diff options
-rw-r--r-- | include/linux/hugetlb.h | 3 | ||||
-rw-r--r-- | mm/hugetlb.c | 10 |
2 files changed, 12 insertions, 1 deletions
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 59225ef27d15..19644e0016bd 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h | |||
@@ -231,6 +231,9 @@ struct hstate { | |||
231 | struct huge_bootmem_page { | 231 | struct huge_bootmem_page { |
232 | struct list_head list; | 232 | struct list_head list; |
233 | struct hstate *hstate; | 233 | struct hstate *hstate; |
234 | #ifdef CONFIG_HIGHMEM | ||
235 | phys_addr_t phys; | ||
236 | #endif | ||
234 | }; | 237 | }; |
235 | 238 | ||
236 | struct page *alloc_huge_page_node(struct hstate *h, int nid); | 239 | struct page *alloc_huge_page_node(struct hstate *h, int nid); |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index bfcf153bc829..c6d342d313c7 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -1105,8 +1105,16 @@ static void __init gather_bootmem_prealloc(void) | |||
1105 | struct huge_bootmem_page *m; | 1105 | struct huge_bootmem_page *m; |
1106 | 1106 | ||
1107 | list_for_each_entry(m, &huge_boot_pages, list) { | 1107 | list_for_each_entry(m, &huge_boot_pages, list) { |
1108 | struct page *page = virt_to_page(m); | ||
1109 | struct hstate *h = m->hstate; | 1108 | struct hstate *h = m->hstate; |
1109 | struct page *page; | ||
1110 | |||
1111 | #ifdef CONFIG_HIGHMEM | ||
1112 | page = pfn_to_page(m->phys >> PAGE_SHIFT); | ||
1113 | free_bootmem_late((unsigned long)m, | ||
1114 | sizeof(struct huge_bootmem_page)); | ||
1115 | #else | ||
1116 | page = virt_to_page(m); | ||
1117 | #endif | ||
1110 | __ClearPageReserved(page); | 1118 | __ClearPageReserved(page); |
1111 | WARN_ON(page_count(page) != 1); | 1119 | WARN_ON(page_count(page) != 1); |
1112 | prep_compound_huge_page(page, h->order); | 1120 | prep_compound_huge_page(page, h->order); |