Date: Thu, 15 Oct 2015 02:27:16 +0000 (UTC) From: Alan Cox <alc@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r289354 - user/alc/PQ_LAUNDRY/sys/vm Message-ID: <201510150227.t9F2RG8S001760@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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++;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510150227.t9F2RG8S001760>