From owner-svn-src-user@freebsd.org Thu Oct 15 02:27:18 2015 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 37A80A13B74 for ; Thu, 15 Oct 2015 02:27:18 +0000 (UTC) (envelope-from alc@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id DE8131383; Thu, 15 Oct 2015 02:27:17 +0000 (UTC) (envelope-from alc@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id t9F2RGdN001761; Thu, 15 Oct 2015 02:27:16 GMT (envelope-from alc@FreeBSD.org) Received: (from alc@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id t9F2RG8S001760; Thu, 15 Oct 2015 02:27:16 GMT (envelope-from alc@FreeBSD.org) Message-Id: <201510150227.t9F2RG8S001760@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: alc set sender to alc@FreeBSD.org using -f From: Alan Cox Date: Thu, 15 Oct 2015 02:27:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r289354 - user/alc/PQ_LAUNDRY/sys/vm X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Oct 2015 02:27:18 -0000 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++;