* 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