svn commit: r330247 - user/markj/vm-playground/sys/vm
Mark Johnston
markj at FreeBSD.org
Thu Mar 1 18:19:15 UTC 2018
Author: markj
Date: Thu Mar 1 18:19:14 2018
New Revision: 330247
URL: https://svnweb.freebsd.org/changeset/base/330247
Log:
Temporarily remove page-clustering code from the PQ_INACTIVE scan.
It will be reintegrated after some page queue locking changes go in.
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 Thu Mar 1 18:11:03 2018 (r330246)
+++ user/markj/vm-playground/sys/vm/vm_pageout.c Thu Mar 1 18:19:14 2018 (r330247)
@@ -1094,104 +1094,6 @@ dolaundry:
}
}
-struct pgo_pglist {
- struct pglist pgl;
- int count;
-};
-
-static void
-vm_pageout_pglist_init(struct pgo_pglist *pglist)
-{
-
- TAILQ_INIT(&pglist->pgl);
- pglist->count = 0;
-}
-
-static void
-vm_pageout_pglist_append(struct pgo_pglist *pglist, vm_page_t m)
-{
- if (vm_page_free_prep(m, false)) {
- m->flags &= ~PG_ZERO;
- TAILQ_INSERT_TAIL(&pglist->pgl, m, listq);
- pglist->count++;
- }
-}
-
-static void
-vm_pageout_pglist_flush(struct pgo_pglist *pglist, bool force)
-{
- if (pglist->count > 64 || (force && pglist->count != 0)) {
- vm_page_free_phys_pglist(&pglist->pgl);
- vm_pageout_pglist_init(pglist);
- }
-}
-
-
-static int
-vm_pageout_free_pages(struct pgo_pglist *pglist, vm_object_t object,
- vm_page_t m)
-{
- vm_page_t p, pp;
- struct mtx *mtx;
- vm_pindex_t start;
- int pcount, count;
-
- pcount = MAX(object->iosize / PAGE_SIZE, 1);
- mtx = vm_page_lockptr(m);
- count = 1;
- if (pcount == 1) {
- vm_pageout_pglist_append(pglist, 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_pageout_pglist_append(pglist, m);
- /* Iterate through the block range and free compatible pages. */
- for (m = p; m != NULL && m->pindex < start + pcount; m = p) {
- p = TAILQ_NEXT(m, listq);
- if (mtx != vm_page_lockptr(m)) {
- mtx_unlock(mtx);
- mtx = vm_page_lockptr(m);
- mtx_lock(mtx);
- }
- 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)
- continue;
-free_page:
- vm_pageout_pglist_append(pglist, m);
- count++;
- }
-out:
- mtx_unlock(mtx);
- VM_OBJECT_WUNLOCK(object);
- vm_pageout_pglist_flush(pglist, false);
- VM_CNT_ADD(v_dfree, count);
-
- return (count);
-}
-
/*
* vm_pageout_scan does the dirty work for the pageout daemon.
*
@@ -1204,7 +1106,6 @@ out:
static bool
vm_pageout_scan(struct vm_domain *vmd, int pass, int shortage)
{
- struct pgo_pglist pglist;
vm_page_t m, next;
struct vm_pagequeue *pq;
vm_object_t object;
@@ -1260,7 +1161,6 @@ vm_pageout_scan(struct vm_domain *vmd, int pass, int s
*/
pq = &vmd->vmd_pagequeues[PQ_INACTIVE];
maxscan = pq->pq_cnt;
- vm_pageout_pglist_init(&pglist);
vm_pagequeue_lock(pq);
queue_locked = TRUE;
for (m = TAILQ_FIRST(&pq->pq_pl);
@@ -1425,17 +1325,15 @@ unlock_page:
*/
if (m->dirty == 0) {
free_page:
- page_shortage -= vm_pageout_free_pages(&pglist,
- object, m);
- goto lock_queue;
+ vm_page_free(m);
+ VM_CNT_INC(v_dfree);
+ --page_shortage;
} else if ((object->flags & OBJ_DEAD) == 0)
vm_page_launder(m);
drop_page:
vm_page_unlock(m);
VM_OBJECT_WUNLOCK(object);
-lock_queue:
if (!queue_locked) {
- vm_pageout_pglist_flush(&pglist, false);
vm_pagequeue_lock(pq);
queue_locked = TRUE;
}
@@ -1443,7 +1341,6 @@ lock_queue:
TAILQ_REMOVE(&pq->pq_pl, &vmd->vmd_marker, plinks.q);
}
vm_pagequeue_unlock(pq);
- vm_pageout_pglist_flush(&pglist, true);
/*
* Wake up the laundry thread so that it can perform any needed
More information about the svn-src-user
mailing list