summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-09-21 21:36:13 +0000
committeralc <alc@FreeBSD.org>2003-09-21 21:36:13 +0000
commitd94df47be52e616ee9b6bbf3968524034a2642d4 (patch)
treed98867a3dfa93fed55eff98c6f0ea88ea011f346
parente00d0cba688f12ec2274ddc3b519e71c5f048311 (diff)
downloadFreeBSD-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.c24
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);
OpenPOWER on IntegriCloud