diff options
Diffstat (limited to 'debian/patches/vm-cache-policy0003-vm-evict-clean-pages-first.patch')
-rw-r--r-- | debian/patches/vm-cache-policy0003-vm-evict-clean-pages-first.patch | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/debian/patches/vm-cache-policy0003-vm-evict-clean-pages-first.patch b/debian/patches/vm-cache-policy0003-vm-evict-clean-pages-first.patch new file mode 100644 index 0000000..f2bf487 --- /dev/null +++ b/debian/patches/vm-cache-policy0003-vm-evict-clean-pages-first.patch @@ -0,0 +1,57 @@ +From c18a562f2b003a893bfb857607ac996ccc5c5be4 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 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 + |