Index: linux-2.6.21-rc5-mm2/mm/sparse.c =================================================================== --- linux-2.6.21-rc5-mm2.orig/mm/sparse.c 2007-04-02 16:47:16.000000000 -0700 +++ linux-2.6.21-rc5-mm2/mm/sparse.c 2007-04-02 17:11:31.000000000 -0700 @@ -253,15 +253,19 @@ void *vmemmap_alloc_block(unsigned long { if (slab_is_available()) { struct page *page = - alloc_pages_node(node, GFP_KERNEL, + alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO, get_order(size)); if (page) return page_address(page); return NULL; - } else - return __alloc_bootmem_node(NODE_DATA(node), size, size, - __pa(MAX_DMA_ADDRESS)); + } else { + void *p = __alloc_bootmem_node(NODE_DATA(node), size, size, + __pa(MAX_DMA_ADDRESS)); + if (p) + memset(p, 0, size); + return p; + } } #ifndef CONFIG_ARCH_POPULATES_VIRTUAL_MEMMAP @@ -273,6 +277,8 @@ static int vmemmap_pte_setup(pte_t *pte, void *block; pte_t entry; + printk(KERN_ERR "vmemmap_pte_setup(%p, %d) *pte=%lx\n", + pte, node, *pte); block = vmemmap_alloc_block(PAGE_SIZE, node); if (!block) return -ENOMEM; @@ -288,6 +294,8 @@ static int vmemmap_pop_pte(pmd_t *pmd, u pte_t *pte; int error = 0; + printk(KERN_ERR "vmemmap_pop_pte(%p, %lx, %lx, %d) *pmd=%lx\n", + pmd, addr, end, node, *pmd); for (pte = pte_offset_map(pmd, addr); addr < end && !error; pte++, addr += PAGE_SIZE) if (pte_none(*pte)) @@ -325,20 +333,22 @@ static int vmemmap_pop_pmd(pud_t *pud, u pmd_t *pmd; int error = 0; + printk(KERN_ERR "vmemmap_pop_pmd(%p, %lx, %lx, %d) *pud=%lx\n", + pud, addr, end, node, *pud); end = pmd_addr_end(addr, end); for (pmd = pmd_offset(pud, addr); addr < end && !error; pmd++, addr += PMD_SIZE) { if (pmd_none(*pmd)) { #ifdef CONFIG_ARCH_SUPPORTS_PMD_MAPPING - errror = vmemmap_pmd_setup(pmd, node); + error = vmemmap_pmd_setup(pmd, node); #else void *p = vmemmap_alloc_block(PAGE_SIZE, node); if (!p) return -ENOMEM; - pmd_populate(&init_mm, pmd, p); + pmd_populate_kernel(&init_mm, pmd, p); #endif } error = vmemmap_pop_pte(pmd, addr, end, node); @@ -352,6 +362,8 @@ static int vmemmap_pop_pud(pgd_t *pgd, u pud_t *pud; int error = 0; + printk(KERN_ERR "vmemmap_pop_pud(%p, %lx, %lx, %d) *pgd=%lx\n", + pgd, addr, end, node, *pgd); end = pud_addr_end(addr, end); for (pud = pud_offset(pgd, addr); addr < end && !error; pud++, addr += PUD_SIZE) { @@ -378,6 +390,8 @@ int vmemmap_populate(struct page *start_ (unsigned long)(start_page + nr)); int error = 0; + printk(KERN_ERR "vmemmap_populate(%p, %ld, %d)\n", + start_page, nr, node); for (pgd = pgd_offset_k(addr); addr < end && !error; pgd++, addr += PGDIR_SIZE) { @@ -400,6 +414,7 @@ static struct page *sparse_early_mem_map int nid = sparse_early_nid(ms); int error; + printk(KERN_ERR "sparse_early_mem_map_alloc(%ld)\n", pnum); map = pfn_to_page(pnum * PAGES_PER_SECTION); error = vmemmap_populate(map, PAGES_PER_SECTION, nid);