After several days of hunting, I found a bug in the MIPS highmem code. A comparison of arch/mips/mm/init.c to arch/i386/mm/init.c supports my claim. The PGD entry for the fixed mapping virtual addresses is never allocated. So what happens is that the fixed mapping pte's get stuffed into the invalid_pte_table! Then, subsequent accesses that ought to fault might alias into these PTE's and get satisfied with somebody else's physical page. The following patch seems to help a great deal: Index: arch/mips/mm/init.c =================================================================== RCS file: /cvs/linux/arch/mips/mm/init.c,v retrieving revision 1.38.2.4 diff -u -r1.38.2.4 init.c --- arch/mips/mm/init.c 2002/02/06 18:29:15 1.38.2.4 +++ arch/mips/mm/init.c 2002/03/14 05:25:12 @@ -206,6 +206,12 @@ #ifdef CONFIG_HIGHMEM /* + * Fixed mappings: + */ + vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; + fixrange_init(vaddr, 0, pgd_base); + + /* * Permanent kmaps: */ vaddr = PKMAP_BASE;