diff options
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_fault.c | 7 | ||||
-rw-r--r-- | sys/vm/vm_map.c | 11 |
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); } |