From 91a700088a53173203486a751ad417502ccaf710 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Sat, 21 Feb 2015 15:20:46 +0100 Subject: [PATCH gnumach 3/3] vm: evict clean pages first * 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 a8db604..5fc8106 100644 --- a/vm/vm_pageout.c +++ b/vm/vm_pageout.c @@ -679,6 +679,28 @@ void vm_pageout_scan(void) /*NOTREACHED*/ } + /* Try to evict a clean page first. */ + simple_lock (&vm_page_queue_clean_lock); + 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_lock); + goto got_one; + } + else + queue_enter (&vm_page_queue_clean, + m, vm_page_t, cleanq); + } + simple_unlock (&vm_page_queue_clean_lock); + vm_pageout_inactive++; /* Find a page we are interested in paging out. If we @@ -695,7 +717,7 @@ void vm_pageout_scan(void) if (!m) goto pause; } - + got_one: object = m->object; /* -- 2.1.4