From owner-svn-src-user@freebsd.org  Fri Mar 23 17:58:34 2018
Return-Path: <owner-svn-src-user@freebsd.org>
Delivered-To: svn-src-user@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 658CEF5F0B1
 for <svn-src-user@mailman.ysv.freebsd.org>;
 Fri, 23 Mar 2018 17:58:34 +0000 (UTC)
 (envelope-from jeff@FreeBSD.org)
Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org
 [IPv6:2610:1c1:1:606c::19:3])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client CN "mxrelay.nyi.freebsd.org",
 Issuer "Let's Encrypt Authority X3" (verified OK))
 by mx1.freebsd.org (Postfix) with ESMTPS id 19BB582B5F;
 Fri, 23 Mar 2018 17:58:34 +0000 (UTC)
 (envelope-from jeff@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 mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 14AB523343;
 Fri, 23 Mar 2018 17:58:34 +0000 (UTC)
 (envelope-from jeff@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w2NHwXJH045731;
 Fri, 23 Mar 2018 17:58:33 GMT (envelope-from jeff@FreeBSD.org)
Received: (from jeff@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id w2NHwXGU045730;
 Fri, 23 Mar 2018 17:58:33 GMT (envelope-from jeff@FreeBSD.org)
Message-Id: <201803231758.w2NHwXGU045730@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: jeff set sender to
 jeff@FreeBSD.org using -f
From: Jeff Roberson <jeff@FreeBSD.org>
Date: Fri, 23 Mar 2018 17:58:33 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-user@freebsd.org
Subject: svn commit: r331444 - user/markj/vm-playground/sys/vm
X-SVN-Group: user
X-SVN-Commit-Author: jeff
X-SVN-Commit-Paths: user/markj/vm-playground/sys/vm
X-SVN-Commit-Revision: 331444
X-SVN-Commit-Repository: base
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.25
Precedence: list
List-Id: "SVN commit messages for the experimental &quot; user&quot;
 src tree" <svn-src-user.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-user/>
List-Post: <mailto:svn-src-user@freebsd.org>
List-Help: <mailto:svn-src-user-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-user>,
 <mailto:svn-src-user-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Fri, 23 Mar 2018 17:58:34 -0000

Author: jeff
Date: Fri Mar 23 17:58:33 2018
New Revision: 331444
URL: https://svnweb.freebsd.org/changeset/base/331444

Log:
  Re-implement vm_pageout_free_pages().

Modified:
  user/markj/vm-playground/sys/vm/vm_pageout.c

Modified: user/markj/vm-playground/sys/vm/vm_pageout.c
==============================================================================
--- user/markj/vm-playground/sys/vm/vm_pageout.c	Fri Mar 23 17:33:14 2018	(r331443)
+++ user/markj/vm-playground/sys/vm/vm_pageout.c	Fri Mar 23 17:58:33 2018	(r331444)
@@ -1126,6 +1126,65 @@ dolaundry:
 	}
 }
 
+static int
+vm_pageout_free_pages(vm_object_t object, vm_page_t m, struct mtx **mtxp)
+{
+	vm_page_t p, pp;
+	vm_pindex_t start;
+	int pcount, count;
+
+	pcount = MAX(object->iosize / PAGE_SIZE, 1);
+	count = 1;
+	if (pcount == 1) {
+		vm_page_free(m);
+		goto out;
+	}
+
+	/* Find the first page in the block. */
+	start = m->pindex - (m->pindex % pcount);
+	for (p = m; p->pindex > start && (pp = vm_page_prev(p)) != NULL; 
+	    p = pp);
+
+	/* Free the original page so we don't validate it twice. */
+	if (p == m)
+		p = vm_page_next(m);
+	vm_page_free(m);
+	/* Iterate through the block range and free compatible pages. */
+	/* XXX Fix cache miss on last page. */
+	for (m = p; m != NULL && m->pindex < start + pcount; m = p) {
+		p = TAILQ_NEXT(m, listq);
+		vm_page_change_lock(m, mtxp);
+		if (vm_page_held(m) || vm_page_busied(m) ||
+		    m->queue != PQ_INACTIVE)
+			continue;
+		if (m->valid == 0)
+			goto free_page;
+		if ((m->aflags & PGA_REFERENCED) != 0)
+			continue;
+		if (object->ref_count != 0) {
+			if (pmap_ts_referenced(m)) {
+				vm_page_aflag_set(m, PGA_REFERENCED);
+				continue;
+			}
+			vm_page_test_dirty(m);
+			if (m->dirty == 0)
+				pmap_remove_all(m);
+		}
+		if (m->dirty) {
+			if ((object->flags & OBJ_DEAD) == 0)
+				vm_page_launder(m);
+			continue;
+		}
+free_page:
+		vm_page_free(m);
+		count++;
+	}
+out:
+	VM_CNT_ADD(v_dfree, count);
+
+	return (count);
+}
+
 /*
  *	vm_pageout_scan does the dirty work for the pageout daemon.
  *
@@ -1364,9 +1423,8 @@ recheck:
 			 */
 			if (m->dirty == 0) {
 free_page:
-				vm_page_free(m);
-				page_shortage--;
-				VM_CNT_INC(v_dfree);
+				page_shortage -= vm_pageout_free_pages(object,
+				    m, &mtx);
 			} else if ((object->flags & OBJ_DEAD) == 0)
 				vm_page_launder(m);
 			continue;