svn commit: r207540 - head/sys/vm

Alan Cox alc at FreeBSD.org
Sun May 2 20:46:17 UTC 2010


Author: alc
Date: Sun May  2 20:46:17 2010
New Revision: 207540
URL: http://svn.freebsd.org/changeset/base/207540

Log:
  Defer the acquisition of the page and page queues locks in
  vm_pageout_object_deactivate_pages().

Modified:
  head/sys/vm/vm_pageout.c

Modified: head/sys/vm/vm_pageout.c
==============================================================================
--- head/sys/vm/vm_pageout.c	Sun May  2 20:24:25 2010	(r207539)
+++ head/sys/vm/vm_pageout.c	Sun May  2 20:46:17 2010	(r207540)
@@ -540,6 +540,7 @@ vm_pageout_object_deactivate_pages(pmap,
 	for (object = first_object;; object = backing_object) {
 		if (pmap_resident_count(pmap) <= desired)
 			goto unlock_return;
+		VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
 		if (object->type == OBJT_PHYS || object->paging_in_progress)
 			goto unlock_return;
 
@@ -551,19 +552,18 @@ vm_pageout_object_deactivate_pages(pmap,
 		 */
 		p = TAILQ_FIRST(&object->memq);
 		while (p != NULL) {
-			vm_page_lock(p);
-			vm_page_lock_queues();
-			if (pmap_resident_count(pmap) <= desired) {
-				vm_page_unlock_queues();
-				vm_page_unlock(p);
+			if (pmap_resident_count(pmap) <= desired)
 				goto unlock_return;
-			}
 			next = TAILQ_NEXT(p, listq);
+			if ((p->oflags & VPO_BUSY) != 0 || p->busy != 0) {
+				p = next;
+				continue;
+			}
+			vm_page_lock(p);
+			vm_page_lock_queues();
 			cnt.v_pdpages++;
 			if (p->wire_count != 0 ||
 			    p->hold_count != 0 ||
-			    p->busy != 0 ||
-			    (p->oflags & VPO_BUSY) ||
 			    !pmap_page_exists_quick(pmap, p)) {
 				vm_page_unlock_queues();
 				vm_page_unlock(p);


More information about the svn-src-all mailing list