diff options
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r-- | sys/vm/vm_fault.c | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 8b843dc..b26972e 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -328,8 +328,6 @@ RetryFault:; */ fs.m = vm_page_lookup(fs.object, fs.pindex); if (fs.m != NULL) { - int queue; - /* * check for page-based copy on write. * We check fs.object == fs.first_object so @@ -398,20 +396,7 @@ RetryFault:; vm_object_deallocate(fs.first_object); goto RetryFault; } - queue = fs.m->queue; - - vm_pageq_remove_nowakeup(fs.m); - - if (VM_PAGE_RESOLVEQUEUE(fs.m, queue) == PQ_CACHE) { - cnt.v_reactivated++; - if (vm_page_count_severe()) { - vm_page_activate(fs.m); - vm_page_unlock_queues(); - unlock_and_deallocate(&fs); - VM_WAITPFAULT; - goto RetryFault; - } - } + vm_pageq_remove(fs.m); vm_page_unlock_queues(); /* @@ -446,6 +431,8 @@ RetryFault:; if (!vm_page_count_severe()) { fs.m = vm_page_alloc(fs.object, fs.pindex, (fs.vp || fs.object->backing_object)? VM_ALLOC_NORMAL: VM_ALLOC_ZERO); + if ((fs.m->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) + break; } if (fs.m == NULL) { unlock_and_deallocate(&fs); @@ -993,9 +980,7 @@ vm_fault_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry) (m->flags & PG_FICTITIOUS) == 0) { vm_page_lock_queues(); - if (!VM_PAGE_INQUEUE1(m, PQ_CACHE)) - pmap_enter_quick(pmap, addr, m, - entry->protection); + pmap_enter_quick(pmap, addr, m, entry->protection); vm_page_unlock_queues(); } VM_OBJECT_UNLOCK(lobject); @@ -1273,7 +1258,8 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage) for (i = 0, tpindex = pindex - 1; tpindex >= startpindex && tpindex < pindex; i++, tpindex--) { - rtm = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL); + rtm = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL | + VM_ALLOC_IFNOTCACHED); if (rtm == NULL) { /* * Shift the allocated pages to the @@ -1311,7 +1297,8 @@ vm_fault_additional_pages(m, rbehind, rahead, marray, reqpage) for (; tpindex < endpindex; i++, tpindex++) { - rtm = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL); + rtm = vm_page_alloc(object, tpindex, VM_ALLOC_NORMAL | + VM_ALLOC_IFNOTCACHED); if (rtm == NULL) { break; } |