svn commit: r331448 - user/markj/vm-playground/sys/vm

Mark Johnston markj at FreeBSD.org
Fri Mar 23 18:15:02 UTC 2018


Author: markj
Date: Fri Mar 23 18:15:01 2018
New Revision: 331448
URL: https://svnweb.freebsd.org/changeset/base/331448

Log:
  Avoid taking the queue lock in _vm_page_deactivate() when requeuing.

Modified:
  user/markj/vm-playground/sys/vm/vm_page.c

Modified: user/markj/vm-playground/sys/vm/vm_page.c
==============================================================================
--- user/markj/vm-playground/sys/vm/vm_page.c	Fri Mar 23 18:11:06 2018	(r331447)
+++ user/markj/vm-playground/sys/vm/vm_page.c	Fri Mar 23 18:15:01 2018	(r331448)
@@ -3863,15 +3863,10 @@ _vm_page_deactivate(vm_page_t m, bool noreuse)
 	if (m->wire_count > 0 || (m->oflags & VPO_UNMANAGED) != 0)
 		return;
 
-	/*
-	 * XXX we can do this with only one lock acquisition if m is already
-	 * in PQ_INACTIVE
-	 */
-	vm_page_remque(m);
-
-	pq = &vm_pagequeue_domain(m)->vmd_pagequeues[PQ_INACTIVE];
 	if (noreuse) {
-		/* This is a slow path. */
+		/* This is slower than it could be. */
+		vm_page_remque(m);
+		pq = &vm_pagequeue_domain(m)->vmd_pagequeues[PQ_INACTIVE];
 		vm_pagequeue_lock(pq);
 		m->queue = PQ_INACTIVE;
 		TAILQ_INSERT_BEFORE(&vm_pagequeue_domain(m)->vmd_inacthead, m,
@@ -3881,8 +3876,11 @@ _vm_page_deactivate(vm_page_t m, bool noreuse)
 		if ((m->aflags & PGA_REQUEUE) != 0)
 			vm_page_aflag_clear(m, PGA_REQUEUE);
 		vm_pagequeue_unlock(pq);
-	} else
+	} else if (!vm_page_inactive(m)) {
+		vm_page_remque(m);
 		vm_page_enqueue_lazy(m, PQ_INACTIVE);
+	} else
+		vm_page_requeue(m);
 }
 
 /*


More information about the svn-src-user mailing list