svn commit: r188383 - head/sys/vm

Alan Cox alc at FreeBSD.org
Sun Feb 8 22:23:22 PST 2009


Author: alc
Date: Mon Feb  9 06:23:21 2009
New Revision: 188383
URL: http://svn.freebsd.org/changeset/base/188383

Log:
  Avoid some cases of unnecessary page queues locking by vm_fault's delete-
  behind heuristic.

Modified:
  head/sys/vm/vm_fault.c

Modified: head/sys/vm/vm_fault.c
==============================================================================
--- head/sys/vm/vm_fault.c	Mon Feb  9 05:09:52 2009	(r188382)
+++ head/sys/vm/vm_fault.c	Mon Feb  9 06:23:21 2009	(r188383)
@@ -212,7 +212,7 @@ vm_fault(vm_map_t map, vm_offset_t vaddr
 {
 	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;
 			}


More information about the svn-src-head mailing list