Index: sys/amd64/amd64/pmap.c =================================================================== --- sys/amd64/amd64/pmap.c +++ sys/amd64/amd64/pmap.c @@ -2307,9 +2307,7 @@ if (vm_page_pa_tryrelock(pmap, (pde & PG_PS_FRAME) | (va & PDRMASK), &pa)) goto retry; - m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) | - (va & PDRMASK)); - vm_page_hold(m); + m = PHYS_TO_VM_PAGE(pa); } } else { pte = *pmap_pde_to_pte(pdep, va); @@ -2318,11 +2316,11 @@ if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME, &pa)) goto retry; - m = PHYS_TO_VM_PAGE(pte & PG_FRAME); - if (m != NULL) - vm_page_hold(m); + m = PHYS_TO_VM_PAGE(pa); } } + if (m != NULL) + vm_page_hold(m); } PA_UNLOCK_COND(pa); PMAP_UNLOCK(pmap); Index: sys/i386/i386/pmap.c =================================================================== --- sys/i386/i386/pmap.c +++ sys/i386/i386/pmap.c @@ -1672,9 +1672,7 @@ if (vm_page_pa_tryrelock(pmap, (pde & PG_PS_FRAME) | (va & PDRMASK), &pa)) goto retry; - m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) | - (va & PDRMASK)); - vm_page_hold(m); + m = PHYS_TO_VM_PAGE(pa); } } else { pte = pmap_pte_ufast(pmap, va, pde); @@ -1683,11 +1681,11 @@ if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME, &pa)) goto retry; - m = PHYS_TO_VM_PAGE(pte & PG_FRAME); - if (m != NULL) - vm_page_hold(m); + m = PHYS_TO_VM_PAGE(pa); } } + if (m != NULL) + vm_page_hold(m); } PA_UNLOCK_COND(pa); PMAP_UNLOCK(pmap); Index: sys/vm/vm_page.c =================================================================== --- sys/vm/vm_page.c +++ sys/vm/vm_page.c @@ -551,6 +551,9 @@ vm_paddr_t biggestsize, last_pa, pa; u_long pagecount; int biggestone, i, segind; +#if defined(__i386__) && defined(VM_PHYSSEG_DENSE) + long ii; +#endif biggestsize = 0; biggestone = 0; @@ -789,6 +792,13 @@ * Initialize the page structures and add every available page to the * physical memory allocator's free lists. */ +#if defined(__i386__) && defined(VM_PHYSSEG_DENSE) + for (ii = 0; ii < vm_page_array_size; ii++) { + m = &vm_page_array[ii]; + vm_page_init_page(m, (first_page + ii) << PAGE_SHIFT, 0); + m->flags = PG_FICTITIOUS; + } +#endif vm_cnt.v_page_count = 0; for (segind = 0; segind < vm_phys_nsegs; segind++) { seg = &vm_phys_segs[segind];