static phys_addr_t __meminit alloc_pud_late(uintptr_t va)
 {
-       unsigned long vaddr;
+       struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL, 0);
 
-       vaddr = __get_free_page(GFP_KERNEL);
-       BUG_ON(!vaddr);
-       return __pa(vaddr);
+       BUG_ON(!ptdesc);
+       pagetable_pud_ctor(ptdesc);
+       return __pa((pud_t *)ptdesc_address(ptdesc));
 }
 
 static p4d_t *__init get_p4d_virt_early(phys_addr_t pa)
 
 static phys_addr_t __meminit alloc_p4d_late(uintptr_t va)
 {
-       unsigned long vaddr;
+       struct ptdesc *ptdesc = pagetable_alloc(GFP_KERNEL, 0);
 
-       vaddr = __get_free_page(GFP_KERNEL);
-       BUG_ON(!vaddr);
-       return __pa(vaddr);
+       BUG_ON(!ptdesc);
+       pagetable_p4d_ctor(ptdesc);
+       return __pa((p4d_t *)ptdesc_address(ptdesc));
 }
 
 static void __meminit create_pud_mapping(pud_t *pudp, uintptr_t va, phys_addr_t pa, phys_addr_t sz,