sparc64: simplify vmemmap_populate
[sfrench/cifs-2.6.git] / arch / sparc / mm / init_64.c
index 61bdc1270d195e551d190977b03e1e9fb604ec75..051f7340179389a85bf3fe89e019e7ab5c60c816 100644 (file)
@@ -2540,9 +2540,16 @@ void __init mem_init(void)
 {
        high_memory = __va(last_valid_pfn << PAGE_SHIFT);
 
-       register_page_bootmem_info();
        free_all_bootmem();
 
+       /*
+        * Must be done after boot memory is put on freelist, because here we
+        * might set fields in deferred struct pages that have not yet been
+        * initialized, and free_all_bootmem() initializes all the reserved
+        * deferred pages for us.
+        */
+       register_page_bootmem_info();
+
        /*
         * Set up the zero page, mark it reserved, so that page count
         * is not manipulated when freeing the page from user ptes.
@@ -2637,30 +2644,19 @@ int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
        vstart = vstart & PMD_MASK;
        vend = ALIGN(vend, PMD_SIZE);
        for (; vstart < vend; vstart += PMD_SIZE) {
-               pgd_t *pgd = pgd_offset_k(vstart);
+               pgd_t *pgd = vmemmap_pgd_populate(vstart, node);
                unsigned long pte;
                pud_t *pud;
                pmd_t *pmd;
 
-               if (pgd_none(*pgd)) {
-                       pud_t *new = vmemmap_alloc_block(PAGE_SIZE, node);
-
-                       if (!new)
-                               return -ENOMEM;
-                       pgd_populate(&init_mm, pgd, new);
-               }
-
-               pud = pud_offset(pgd, vstart);
-               if (pud_none(*pud)) {
-                       pmd_t *new = vmemmap_alloc_block(PAGE_SIZE, node);
+               if (!pgd)
+                       return -ENOMEM;
 
-                       if (!new)
-                               return -ENOMEM;
-                       pud_populate(&init_mm, pud, new);
-               }
+               pud = vmemmap_pud_populate(pgd, vstart, node);
+               if (!pud)
+                       return -ENOMEM;
 
                pmd = pmd_offset(pud, vstart);
-
                pte = pmd_val(*pmd);
                if (!(pte & _PAGE_VALID)) {
                        void *block = vmemmap_alloc_block(PMD_SIZE, node);
@@ -2927,7 +2923,7 @@ void __flush_tlb_all(void)
 pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
                            unsigned long address)
 {
-       struct page *page = alloc_page(GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO);
+       struct page *page = alloc_page(GFP_KERNEL | __GFP_ZERO);
        pte_t *pte = NULL;
 
        if (page)
@@ -2939,7 +2935,7 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
 pgtable_t pte_alloc_one(struct mm_struct *mm,
                        unsigned long address)
 {
-       struct page *page = alloc_page(GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO);
+       struct page *page = alloc_page(GFP_KERNEL | __GFP_ZERO);
        if (!page)
                return NULL;
        if (!pgtable_page_ctor(page)) {