[PATCH][2.6-mm] setup_identity_mappings depends on zone init.

Zwane Mwaikambo
2004-04-04T09:07:24Z

On Mon, 15 Mar 2004, Andrew Morton wrote:

> Calling page_address_init() earlier isn't the fix though - pmd pages aren't
> in highmem so we should never have got that far. Looks like the pgd or the
> pmd page contains garbage. Did you try it without CONFIG_DEBUG_SLAB?
>
> Nick was seeing slab 0x6b patterns on the NUMAQ, inside the pmd, so there's
> some consistency there. We do have one early setup fix from Manfred, but
> it's unlikely to cure this.
>
> I'll have a play with your .config, see if I can reproduce it. If not I'll
> squeeze off -mm3 and would ask you to retest on that if poss.

I spent a bit of time on this today, and the problem appears to be that we haven't
done mem_map or zone initialisation, so mem_map[pfn]->flags is also wrong
(e.g. PG_highmem tests). This is still triple faulting on 2.6.5-rc3-mm4 on my
boxes. CONFIG_HIGHMEM and any setup without 4MB pages should do it. The
following patch got an approving nod from Bill.

Index: linux-2.6.5-rc3-mm4/arch/i386/mm/init.c
===================================================================
RCS file: /home/cvsroot/linux-2.6.5-rc3-mm4/arch/i386/mm/init.c,v
retrieving revision 1.1.1.1
diff -u -p -B -r1.1.1.1 init.c
--- linux-2.6.5-rc3-mm4/arch/i386/mm/init.c 2 Apr 2004 03:55:20 -0000 1.1.1.1
+++ linux-2.6.5-rc3-mm4/arch/i386/mm/init.c 4 Apr 2004 09:04:48 -0000
@@ -206,7 +206,7 @@ void setup_identity_mappings(pgd_t *pgd_
if (!pmd_present(*pmd))
pte_base = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
else
- pte_base = (pte_t *) page_address(pmd_page(*pmd));
+ pte_base = (pte_t *) pmd_page_kernel(*pmd);
pte = pte_base;
for (k = 0; k < PTRS_PER_PTE; pte++, k++) {
vaddr = i*PGDIR_SIZE + j*PMD_SIZE + k*PAGE_SIZE;