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

Alan Cox alc at FreeBSD.org
Thu Oct 15 02:27:18 UTC 2015


Author: alc
Date: Thu Oct 15 02:27:16 2015
New Revision: 289354
URL: https://svnweb.freebsd.org/changeset/base/289354

Log:
  On error, move undirtied pages out of the laundry.
  
  Precisely count the number of pages laundered by an I/O operation.
  
  Sponsored by:	EMC / Isilon Storage Division

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	Thu Oct 15 01:51:10 2015	(r289353)
+++ user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c	Thu Oct 15 02:27:16 2015	(r289354)
@@ -119,7 +119,7 @@ __FBSDID("$FreeBSD$");
 /* the kernel process "vm_pageout"*/
 static void vm_pageout(void);
 static void vm_pageout_init(void);
-static int vm_pageout_clean(vm_page_t m);
+static int vm_pageout_clean(vm_page_t m, int *numpagedout);
 static int vm_pageout_cluster(vm_page_t m);
 static void vm_pageout_scan(struct vm_domain *vmd, int pass);
 static void vm_pageout_mightbe_oom(struct vm_domain *vmd, int pass);
@@ -534,6 +534,9 @@ vm_pageout_flush(vm_page_t *mc, int coun
 			 * worked.
 			 */
 			vm_page_undirty(mt);
+			vm_page_lock(mt);
+			vm_page_deactivate(mt);
+			vm_page_unlock(mt);
 			break;
 		case VM_PAGER_ERROR:
 		case VM_PAGER_FAIL:
@@ -907,7 +910,7 @@ vm_pageout_map_deactivate_pages(map, des
  * Returns 0 on success and an errno otherwise.
  */
 static int
-vm_pageout_clean(vm_page_t m)
+vm_pageout_clean(vm_page_t m, int *numpagedout)
 {
 	struct vnode *vp;
 	struct mount *mp;
@@ -989,7 +992,7 @@ vm_pageout_clean(vm_page_t m)
 	 * laundry.  If it is still in the laundry, then we
 	 * start the cleaning operation. 
 	 */
-	if (vm_pageout_cluster(m) == 0)
+	if ((*numpagedout = vm_pageout_cluster(m)) == 0)
 		error = EIO;
 
 unlock_all:
@@ -1017,7 +1020,7 @@ vm_pageout_launder1(struct vm_domain *vm
 	struct vm_page laundry_marker;
 	struct vm_pagequeue *pq;
 	vm_object_t object;
-	int act_delta, error, maxlaunder, maxscan, vnodes_skipped;
+	int act_delta, error, maxlaunder, maxscan, numpagedout, vnodes_skipped;
 	boolean_t pageout_ok, queues_locked;
 
 	vm_pageout_init_marker(&laundry_marker, PQ_LAUNDRY);
@@ -1029,7 +1032,7 @@ vm_pageout_launder1(struct vm_domain *vm
 	    vm_paging_target() + vm_pageout_deficit;
 	if (maxlaunder < 0)
 		return;
-	maxlaunder /= 8;
+	maxlaunder /= 5;
 
 	vnodes_skipped = 0;
 
@@ -1157,9 +1160,9 @@ free_page:
 				vm_page_requeue_locked(m);
 				goto drop_page;
 			}
-			error = vm_pageout_clean(m);
+			error = vm_pageout_clean(m, &numpagedout);
 			if (error == 0)
-				maxlaunder--;
+				maxlaunder -= numpagedout;
 			else if (error == EDEADLK) {
 				pageout_lock_miss++;
 				vnodes_skipped++;


More information about the svn-src-user mailing list