The memory hotadd code assumes that the pud always exists already, but 
that might be not true. Allocate it if it isn't there.

Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>

---
 arch/x86/mm/init_64.c |   13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

Index: linux/arch/x86/mm/init_64.c
===================================================================
--- linux.orig/arch/x86/mm/init_64.c
+++ linux/arch/x86/mm/init_64.c
@@ -432,17 +432,22 @@ void __init_refok init_memory_mapping(un
                unsigned long pud_phys;
                pud_t *pud;
 
-               if (after_bootmem)
+               if (after_bootmem) {
                        pud = pud_offset(pgd, start & PGDIR_MASK);
-               else
+                       if (!pud_present(*pud)) {
+                               pud = (pud_t *)get_zeroed_page(GFP_ATOMIC);
+                               if (!pud)
+                                       panic("Out of memory");
+                       }
+                       pud_phys = __pa(pud);
+               } else
                        pud = alloc_low_page(&pud_phys);
 
                next = start + PGDIR_SIZE;
                if (next > end)
                        next = end;
                phys_pud_init(pud, __pa(start), __pa(next));
-               if (!after_bootmem)
-                       set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
+               set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
                unmap_low_page(pud);
        }
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to