From owner-svn-src-user@freebsd.org Wed Oct 19 22:19:39 2016 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 CF945C19F01 for ; Wed, 19 Oct 2016 22:19:39 +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 7701DCD6; Wed, 19 Oct 2016 22:19:39 +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 u9JMJc4r069988; Wed, 19 Oct 2016 22:19:38 GMT (envelope-from alc@FreeBSD.org) Received: (from alc@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u9JMJcWj069987; Wed, 19 Oct 2016 22:19:38 GMT (envelope-from alc@FreeBSD.org) Message-Id: <201610192219.u9JMJcWj069987@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: alc set sender to alc@FreeBSD.org using -f From: Alan Cox Date: Wed, 19 Oct 2016 22:19:38 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r307661 - 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.23 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: Wed, 19 Oct 2016 22:19:39 -0000 Author: alc Date: Wed Oct 19 22:19:38 2016 New Revision: 307661 URL: https://svnweb.freebsd.org/changeset/base/307661 Log: Always pause() for a short interval after sending a batch of dirty pages to secondary storage. Previously, another laundering run could start right after sending the batch, which is not what we intended. Use different wait messages when the laundry thread pauses versus sleeps. 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 Wed Oct 19 21:50:57 2016 (r307660) +++ user/alc/PQ_LAUNDRY/sys/vm/vm_pageout.c Wed Oct 19 22:19:38 2016 (r307661) @@ -1214,7 +1214,7 @@ trybackground: } dolaundry: - if (launder > 0) + if (launder > 0) { /* * Because of I/O clustering, the number of laundered * pages could exceed "target" by the maximum size of @@ -1222,20 +1222,18 @@ dolaundry: */ target -= min(vm_pageout_launder(domain, launder, in_shortfall), target); + pause("laundp", hz / VM_LAUNDER_INTERVAL); + } /* - * Sleep for a little bit if we're in the middle of a laundering - * run or a pagedaemon thread has signalled us since the last run - * started. Otherwise, wait for a kick from the pagedaemon. + * If we're not currently laundering pages and the page daemon + * hasn't posted a new request, sleep until the page daemon + * kicks us. */ vm_pagequeue_lock(pq); - if (target > 0 || vm_laundry_request != VM_LAUNDRY_IDLE) { - vm_pagequeue_unlock(pq); - pause("laundr", hz / VM_LAUNDER_INTERVAL); - vm_pagequeue_lock(pq); - } else + if (target == 0 && vm_laundry_request == VM_LAUNDRY_IDLE) (void)mtx_sleep(&vm_laundry_request, - vm_pagequeue_lockptr(pq), PVM, "laundr", 0); + vm_pagequeue_lockptr(pq), PVM, "launds", 0); /* * If the pagedaemon has indicated that it's in shortfall, start