summaryrefslogtreecommitdiff
path: root/debian/patches/vm-cache-policy0003-vm-evict-clean-pages-first.patch
blob: c7b03b4473357ab82aa87a30b126c7669c88581b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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