[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH gnumach 3/3] vm: evict clean pages first
From: |
Justus Winter |
Subject: |
[PATCH gnumach 3/3] vm: evict clean pages first |
Date: |
Sat, 21 Feb 2015 16:02:03 +0100 |
* vm/vm_pageout.c (vm_pageout_scan): Evict clean pages from the list
of clean pages first, without requiring an expensive scan through the
inactive list.
---
vm/vm_pageout.c | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/vm/vm_pageout.c b/vm/vm_pageout.c
index eb68b20..740a465 100644
--- a/vm/vm_pageout.c
+++ b/vm/vm_pageout.c
@@ -681,6 +681,28 @@ void vm_pageout_scan(void)
/*NOTREACHED*/
}
+ /* Try to evict a clean page first. */
+ simple_lock (&vm_page_queue_clean);
+ int tries;
+ for (tries = vm_page_clean_count; tries; tries--)
+ {
+ assert (! queue_empty (&vm_page_queue_clean));
+ queue_remove_first (&vm_page_queue_clean,
+ m, vm_page_t, cleanq);
+ if (! m->active && m->inactive
+ && (want_pages || m->external))
+ {
+ m->cleanq.next = NULL;
+ vm_page_clean_count -= 1;
+ simple_unlock (&vm_page_queue_clean);
+ goto got_one;
+ }
+ else
+ queue_enter (&vm_page_queue_clean,
+ m, vm_page_t, cleanq);
+ }
+ simple_unlock (&vm_page_queue_clean);
+
vm_pageout_inactive++;
/* Find a page we are interested in paging out. If we
@@ -697,7 +719,7 @@ void vm_pageout_scan(void)
if (!m)
goto pause;
}
-
+ got_one:
object = m->object;
/*
--
2.1.4