diff options
author | alc <alc@FreeBSD.org> | 2003-09-21 21:36:13 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-09-21 21:36:13 +0000 |
commit | d94df47be52e616ee9b6bbf3968524034a2642d4 (patch) | |
tree | d98867a3dfa93fed55eff98c6f0ea88ea011f346 | |
parent | e00d0cba688f12ec2274ddc3b519e71c5f048311 (diff) | |
download | FreeBSD-src-d94df47be52e616ee9b6bbf3968524034a2642d4.zip FreeBSD-src-d94df47be52e616ee9b6bbf3968524034a2642d4.tar.gz |
Allocate the page table directory page(s) as "no object" pages. (This
leaves one explicit use of the pte object.)
-rw-r--r-- | sys/i386/i386/pmap.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 0306528..fad1e3d 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -1081,8 +1081,9 @@ void pmap_pinit(pmap) register struct pmap *pmap; { - vm_page_t ptdpg[NPGPTD]; + vm_page_t m, ptdpg[NPGPTD]; vm_paddr_t pa; + static int color; int i; /* @@ -1112,16 +1113,19 @@ pmap_pinit(pmap) /* * allocate the page directory page(s) */ - for (i = 0; i < NPGPTD; i++) { - VM_OBJECT_LOCK(pmap->pm_pteobj); - ptdpg[i] = vm_page_grab(pmap->pm_pteobj, PTDPTDI + i, - VM_ALLOC_NORMAL | VM_ALLOC_RETRY | VM_ALLOC_WIRED | + for (i = 0; i < NPGPTD;) { + m = vm_page_alloc(NULL, color++, + VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO); - vm_page_lock_queues(); - vm_page_flag_clear(ptdpg[i], PG_BUSY); - ptdpg[i]->valid = VM_PAGE_BITS_ALL; - vm_page_unlock_queues(); - VM_OBJECT_UNLOCK(pmap->pm_pteobj); + if (m == NULL) + VM_WAIT; + else { + vm_page_lock_queues(); + vm_page_flag_clear(m, PG_BUSY); + m->valid = VM_PAGE_BITS_ALL; + vm_page_unlock_queues(); + ptdpg[i++] = m; + } } pmap_qenter((vm_offset_t)pmap->pm_pdir, ptdpg, NPGPTD); |