summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_fault.c7
-rw-r--r--sys/vm/vm_map.c11
2 files changed, 11 insertions, 7 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 6fac17c..4f6d1e9 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -977,12 +977,11 @@ vm_fault_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry)
(m->busy == 0) &&
(m->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
- if ((m->queue - m->pc) == PQ_CACHE) {
- vm_page_lock_queues();
+ vm_page_lock_queues();
+ if ((m->queue - m->pc) == PQ_CACHE)
vm_page_deactivate(m);
- vm_page_unlock_queues();
- }
mpte = pmap_enter_quick(pmap, addr, m, mpte);
+ vm_page_unlock_queues();
}
VM_OBJECT_UNLOCK(lobject);
}
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 46ed849..e001d9a 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -1369,6 +1369,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
vm_offset_t tmpidx;
int psize;
vm_page_t p, mpte;
+ boolean_t are_queues_locked;
if ((prot & VM_PROT_READ) == 0 || object == NULL)
return;
@@ -1392,6 +1393,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_prot_t prot,
psize = object->size - pindex;
}
+ are_queues_locked = FALSE;
mpte = NULL;
if ((p = TAILQ_FIRST(&object->memq)) != NULL) {
@@ -1420,15 +1422,18 @@ 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->queue - p->pc) == PQ_CACHE) {
+ if (!are_queues_locked) {
+ are_queues_locked = TRUE;
vm_page_lock_queues();
- vm_page_deactivate(p);
- vm_page_unlock_queues();
}
+ if ((p->queue - p->pc) == PQ_CACHE)
+ vm_page_deactivate(p);
mpte = pmap_enter_quick(map->pmap,
addr + ptoa(tmpidx), p, mpte);
}
}
+ if (are_queues_locked)
+ vm_page_unlock_queues();
unlock_return:
VM_OBJECT_UNLOCK(object);
}
OpenPOWER on IntegriCloud