summaryrefslogtreecommitdiff
path: root/debian/patches/vm-cache-policy0003-vm-evict-clean-pages-first.patch
diff options
context:
space:
mode:
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.patch57
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
+