summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r--sys/vm/vm_map.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 93a9863..5fa5673 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -1437,9 +1437,9 @@ void
vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
vm_object_t object, vm_pindex_t pindex, vm_size_t size, int flags)
{
- vm_offset_t tmpidx;
+ vm_offset_t start, tmpidx;
int psize;
- vm_page_t p, mpte;
+ vm_page_t p, p_start;
boolean_t are_queues_locked;
if ((prot & (VM_PROT_READ | VM_PROT_EXECUTE)) == 0 || object == NULL)
@@ -1465,7 +1465,8 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
}
are_queues_locked = FALSE;
- mpte = NULL;
+ start = 0;
+ p_start = NULL;
if ((p = TAILQ_FIRST(&object->memq)) != NULL) {
if (p->pindex < pindex) {
@@ -1493,16 +1494,25 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
if ((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL &&
(p->busy == 0) &&
(p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
+ if (p_start == NULL) {
+ start = addr + ptoa(tmpidx);
+ p_start = p;
+ }
if (!are_queues_locked) {
are_queues_locked = TRUE;
vm_page_lock_queues();
}
if (VM_PAGE_INQUEUE1(p, PQ_CACHE))
vm_page_deactivate(p);
- mpte = pmap_enter_quick(map->pmap,
- addr + ptoa(tmpidx), p, prot, mpte);
+ } else if (p_start != NULL) {
+ pmap_enter_object(map->pmap, start, addr +
+ ptoa(tmpidx), p_start, prot);
+ p_start = NULL;
}
}
+ if (p_start != NULL)
+ pmap_enter_object(map->pmap, start, addr + size, p_start,
+ prot);
if (are_queues_locked)
vm_page_unlock_queues();
unlock_return:
OpenPOWER on IntegriCloud