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
|