Re: [PATCH 2/5] hugetlb: add phys addr to struct huge_bootmem_page
From: Becky Bruce <hidden>
Date: 2011-06-30 18:50:38
Also in:
lkml
On Jun 28, 2011, at 4:39 PM, Benjamin Herrenschmidt wrote:
On Tue, 2011-06-28 at 14:54 -0500, Becky Bruce wrote:quoted
struct page *alloc_huge_page_node(struct hstate *h, int nid);diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 6402458..2db81ea 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c@@ -1105,8 +1105,14 @@ static void __initgather_bootmem_prealloc(void) struct huge_bootmem_page *m; =20 list_for_each_entry(m, &huge_boot_pages, list) { - struct page *page =3D virt_to_page(m); struct hstate *h =3D m->hstate; +#ifdef CONFIG_HIGHMEM + struct page *page =3D pfn_to_page(m->phys >> PAGE_SHIFT); + free_bootmem_late((unsigned long)m, + sizeof(struct huge_bootmem_page)); +#else + struct page *page =3D virt_to_page(m); +#endif __ClearPageReserved(page);=20 Why do you add free_bootmem_late() in the highmem case and not the normal case ?
Because there was no bootmem allocation in the normal case - the = non-highmem version stores data structure in the huge page itself. This = is perfectly fine as long as you have a mapping. Since this isn't true = for HIGHMEM pages, I allocate bootmem to store the early data structure = that stores information about the hugepage (this happens in = arch-specific code in alloc_bootmem_huge_page). -Becky