svn commit: r307389 - user/alc/PQ_LAUNDRY/sys/vm

Alan Cox alc at FreeBSD.org
Sun Oct 16 05:32:30 UTC 2016


Author: alc
Date: Sun Oct 16 05:32:28 2016
New Revision: 307389
URL: https://svnweb.freebsd.org/changeset/base/307389

Log:
  Rename prev_shortfall to in_shortfall and change its type to bool.
  
  Change the control flow so that we don't unnecessarily perform
  vm_laundry_target().
  
  Reviewed by:	markj

Modified:
  user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c

Modified: user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c
==============================================================================
--- user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c	Sun Oct 16 04:22:04 2016	(r307388)
+++ user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c	Sun Oct 16 05:32:28 2016	(r307389)
@@ -262,7 +262,7 @@ SYSCTL_INT(_vm, OID_AUTO, max_wired,
 static u_int isqrt(u_int num);
 static boolean_t vm_pageout_fallback_object_lock(vm_page_t, vm_page_t *);
 static int vm_pageout_launder(struct vm_domain *vmd, int launder,
-    bool shortfall);
+    bool in_shortfall);
 static void vm_pageout_laundry_worker(void *arg);
 #if !defined(NO_SWAPPING)
 static void vm_pageout_map_deactivate_pages(vm_map_t, long);
@@ -878,7 +878,7 @@ unlock_mp:
  * Returns the number of pages successfully laundered.
  */
 static int
-vm_pageout_launder(struct vm_domain *vmd, int launder, bool shortfall)
+vm_pageout_launder(struct vm_domain *vmd, int launder, bool in_shortfall)
 {
 	struct vm_pagequeue *pq;
 	vm_object_t object;
@@ -986,7 +986,7 @@ vm_pageout_launder(struct vm_domain *vmd
 				 * laundry queue, and an activation is a valid
 				 * way out.
 				 */
-				if (!shortfall)
+				if (!in_shortfall)
 					launder--;
 				goto drop_page;
 			} else if ((object->flags & OBJ_DEAD) == 0)
@@ -1114,8 +1114,9 @@ vm_pageout_laundry_worker(void *arg)
 	struct vm_pagequeue *pq;
 	uint64_t nclean, ndirty;
 	u_int last_launder, wakeups;
-	int cycle, domidx, last_target, launder, prev_shortfall, shortfall;
+	int cycle, domidx, last_target, launder, shortfall;
 	int sleeptime, target;
+	bool in_shortfall;
 
 	domidx = (uintptr_t)arg;
 	domain = &vm_dom[domidx];
@@ -1123,17 +1124,18 @@ vm_pageout_laundry_worker(void *arg)
 	KASSERT(domain->vmd_segs != 0, ("domain without segments"));
 	vm_pageout_init_marker(&domain->vmd_laundry_marker, PQ_LAUNDRY);
 
+	shortfall = 0;
+	in_shortfall = false;
+	target = 0;
 	cycle = 0;
 	last_launder = 0;
-	shortfall = prev_shortfall = 0;
-	target = 0;
 
 	/*
 	 * The pageout laundry worker is never done, so loop forever.
 	 */
 	for (;;) {
-		KASSERT(cycle >= 0, ("negative cycle %d", cycle));
 		KASSERT(target >= 0, ("negative target %d", target));
+		KASSERT(cycle >= 0, ("negative cycle %d", cycle));
 		launder = 0;
 		wakeups = VM_METER_PCPU_CNT(v_pdwakeups);
 
@@ -1142,26 +1144,26 @@ vm_pageout_laundry_worker(void *arg)
 		 * shortage of free pages.
 		 */
 		if (shortfall > 0) {
+			in_shortfall = true;
 			target = shortfall;
 			cycle = VM_LAUNDER_RATE;
-			prev_shortfall = shortfall;
-		}
-		if (prev_shortfall > 0) {
+		} else if (!in_shortfall)
+			goto trybackground;
+		else if (cycle == 0 || vm_laundry_target() <= 0) {
 			/*
-			 * We entered shortfall at some point in the recent
-			 * past.  If we have reached our target, or the
-			 * laundering run is finished and we're not currently in
-			 * shortfall, we have no immediate need to launder
-			 * pages.  Otherwise keep laundering.
+			 * We recently entered shortfall and began laundering
+			 * pages.  If we have completed that laundering run
+			 * (and we are no longer in shortfall) or we have met
+			 * our laundry target through other activity, then we
+			 * can stop laundering pages.
 			 */
-			if (vm_laundry_target() <= 0 || cycle == 0) {
-				prev_shortfall = target = 0;
-			} else {
-				last_launder = wakeups;
-				launder = target / cycle--;
-				goto dolaundry;
-			}
-		}
+			in_shortfall = false;
+			target = 0;
+			goto trybackground;
+		}
+		last_launder = wakeups;
+		launder = target / cycle--;
+		goto dolaundry;
 
 		/*
 		 * There's no immediate need to launder any pages; see if we
@@ -1180,6 +1182,7 @@ vm_pageout_laundry_worker(void *arg)
 		 * ratio of dirty to clean inactive pages grows, the amount of
 		 * memory pressure required to trigger laundering decreases.
 		 */
+trybackground:
 		nclean = vm_cnt.v_inactive_count + vm_cnt.v_free_count;
 		ndirty = vm_cnt.v_laundry_count;
 		if (target == 0 && wakeups != last_launder &&
@@ -1217,7 +1220,7 @@ dolaundry:
 			 * a cluster minus one. 
 			 */
 			target -= min(vm_pageout_launder(domain, launder,
-			    prev_shortfall > 0), target);
+			    in_shortfall), target);
 
 		/*
 		 * Sleep for a little bit if we're in the middle of a laundering


More information about the svn-src-user mailing list