diff options
author | alc <alc@FreeBSD.org> | 2009-02-09 06:23:21 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2009-02-09 06:23:21 +0000 |
commit | e3d0161279089c5ab29bbfd186c2b17a999c10e4 (patch) | |
tree | 183693a5ad2a10729cbbc36e953a9efbe1d304e3 | |
parent | 36e9aee16ddf66147bb72d04075b99c39ad83f23 (diff) | |
download | FreeBSD-src-e3d0161279089c5ab29bbfd186c2b17a999c10e4.zip FreeBSD-src-e3d0161279089c5ab29bbfd186c2b17a999c10e4.tar.gz |
Avoid some cases of unnecessary page queues locking by vm_fault's delete-
behind heuristic.
-rw-r--r-- | sys/vm/vm_fault.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 42245c8..e647288 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -212,7 +212,7 @@ vm_fault(vm_map_t map, vm_offset_t vaddr, vm_prot_t fault_type, { vm_prot_t prot; int is_first_object_locked, result; - boolean_t growstack, wired; + boolean_t are_queues_locked, growstack, wired; int map_generation; vm_object_t next_object; vm_page_t marray[VM_FAULT_READ]; @@ -480,7 +480,7 @@ readrest: else firstpindex = fs.first_pindex - 2 * VM_FAULT_READ; - vm_page_lock_queues(); + are_queues_locked = FALSE; /* * note: partially valid pages cannot be * included in the lookahead - NFS piecemeal @@ -495,8 +495,13 @@ readrest: if (mt == NULL || (mt->valid != VM_PAGE_BITS_ALL)) break; if (mt->busy || - (mt->oflags & VPO_BUSY) || - mt->hold_count || + (mt->oflags & VPO_BUSY)) + continue; + if (!are_queues_locked) { + are_queues_locked = TRUE; + vm_page_lock_queues(); + } + if (mt->hold_count || mt->wire_count) continue; pmap_remove_all(mt); @@ -506,7 +511,8 @@ readrest: vm_page_cache(mt); } } - vm_page_unlock_queues(); + if (are_queues_locked) + vm_page_unlock_queues(); ahead += behind; behind = 0; } |