summaryrefslogtreecommitdiff
path: root/debian/patches/vm-cache-policy0002-Fix-page-cache-accounting.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/vm-cache-policy0002-Fix-page-cache-accounting.patch')
-rw-r--r--debian/patches/vm-cache-policy0002-Fix-page-cache-accounting.patch180
1 files changed, 180 insertions, 0 deletions
diff --git a/debian/patches/vm-cache-policy0002-Fix-page-cache-accounting.patch b/debian/patches/vm-cache-policy0002-Fix-page-cache-accounting.patch
new file mode 100644
index 0000000..739c68e
--- /dev/null
+++ b/debian/patches/vm-cache-policy0002-Fix-page-cache-accounting.patch
@@ -0,0 +1,180 @@
+From 10c45d92cba6858f1bc3fd4ff94363fe2bf85074 Mon Sep 17 00:00:00 2001
+From: Richard Braun <rbraun@sceen.net>
+Date: Sun, 7 Feb 2016 14:08:24 +0100
+Subject: [PATCH gnumach 2/2] Fix page cache accounting
+
+* vm/vm_object.c (vm_object_bootstrap): Set template object `cached'
+member to FALSE.
+(vm_object_cache_add, vm_object_cache_remove): New functions.
+(vm_object_collect, vm_object_deallocate, vm_object_lookup,
+vm_object_lookup_name, vm_object_destroy): Use new cache management functions.
+(vm_object_terminate, vm_object_collapse): Make sure object isn't cached.
+* vm/vm_object.h (struct vm_object): New `cached' member.
+---
+ vm/vm_object.c | 70 +++++++++++++++++++++++++++++++++-------------------------
+ vm/vm_object.h | 3 ++-
+ 2 files changed, 42 insertions(+), 31 deletions(-)
+
+diff --git a/vm/vm_object.c b/vm/vm_object.c
+index 449af16..bc30128 100644
+--- a/vm/vm_object.c
++++ b/vm/vm_object.c
+@@ -303,6 +303,7 @@ void vm_object_bootstrap(void)
+
+ vm_object_template.paging_in_progress = 0;
+ vm_object_template.can_persist = FALSE;
++ vm_object_template.cached = FALSE;
+ vm_object_template.internal = TRUE;
+ vm_object_template.temporary = TRUE;
+ vm_object_template.alive = TRUE;
+@@ -348,6 +349,33 @@ void vm_object_init(void)
+ IKOT_PAGING_NAME);
+ }
+
++/*
++ * Object cache management functions.
++ *
++ * Both the cache and the object must be locked
++ * before calling these functions.
++ */
++
++static void vm_object_cache_add(
++ vm_object_t object)
++{
++ assert(!object->cached);
++ queue_enter(&vm_object_cached_list, object, vm_object_t, cached_list);
++ vm_object_cached_count++;
++ vm_object_cached_pages_update(object->resident_page_count);
++ object->cached = TRUE;
++}
++
++static void vm_object_cache_remove(
++ vm_object_t object)
++{
++ assert(object->cached);
++ queue_remove(&vm_object_cached_list, object, vm_object_t, cached_list);
++ vm_object_cached_count--;
++ vm_object_cached_pages_update(-object->resident_page_count);
++ object->cached = FALSE;
++}
++
+ void vm_object_collect(
+ register vm_object_t object)
+ {
+@@ -371,7 +399,7 @@ void vm_object_collect(
+ return;
+ }
+
+- queue_remove(&vm_object_cached_list, object, vm_object_t, cached_list);
++ vm_object_cache_remove(object);
+ vm_object_terminate(object);
+ }
+
+@@ -438,12 +466,8 @@ void vm_object_deallocate(
+ * it in the cache.
+ */
+ if (object->can_persist && (object->resident_page_count > 0)) {
+- queue_enter(&vm_object_cached_list, object,
+- vm_object_t, cached_list);
+- vm_object_cached_count++;
+- vm_object_cached_pages_update(object->resident_page_count);
++ vm_object_cache_add(object);
+ vm_object_cache_unlock();
+-
+ vm_object_unlock(object);
+ return;
+ }
+@@ -594,6 +618,7 @@ void vm_object_terminate(
+
+ assert(object->ref_count == 0);
+ assert(object->paging_in_progress == 0);
++ assert(!object->cached);
+
+ /*
+ * Throw away port rights... note that they may
+@@ -1779,12 +1804,8 @@ vm_object_t vm_object_lookup(
+
+ assert(object->alive);
+
+- if (object->ref_count == 0) {
+- queue_remove(&vm_object_cached_list, object,
+- vm_object_t, cached_list);
+- vm_object_cached_count--;
+- vm_object_cached_pages_update(-object->resident_page_count);
+- }
++ if (object->ref_count == 0)
++ vm_object_cache_remove(object);
+
+ object->ref_count++;
+ vm_object_unlock(object);
+@@ -1811,12 +1832,8 @@ vm_object_t vm_object_lookup_name(
+
+ assert(object->alive);
+
+- if (object->ref_count == 0) {
+- queue_remove(&vm_object_cached_list, object,
+- vm_object_t, cached_list);
+- vm_object_cached_count--;
+- vm_object_cached_pages_update(-object->resident_page_count);
+- }
++ if (object->ref_count == 0)
++ vm_object_cache_remove(object);
+
+ object->ref_count++;
+ vm_object_unlock(object);
+@@ -1848,12 +1865,8 @@ void vm_object_destroy(
+
+ object = (vm_object_t) pager->ip_kobject;
+ vm_object_lock(object);
+- if (object->ref_count == 0) {
+- queue_remove(&vm_object_cached_list, object,
+- vm_object_t, cached_list);
+- vm_object_cached_count--;
+- vm_object_cached_pages_update(-object->resident_page_count);
+- }
++ if (object->ref_count == 0)
++ vm_object_cache_remove(object);
+ object->ref_count++;
+
+ object->can_persist = FALSE;
+@@ -2001,12 +2014,8 @@ restart:
+
+ if ((object != VM_OBJECT_NULL) && !must_init) {
+ vm_object_lock(object);
+- if (object->ref_count == 0) {
+- queue_remove(&vm_object_cached_list, object,
+- vm_object_t, cached_list);
+- vm_object_cached_count--;
+- vm_object_cached_pages_update(-object->resident_page_count);
+- }
++ if (object->ref_count == 0)
++ vm_object_cache_remove(object);
+ object->ref_count++;
+ vm_object_unlock(object);
+
+@@ -2515,6 +2524,7 @@ void vm_object_collapse(
+ );
+
+ assert(backing_object->alive);
++ assert(!backing_object->cached);
+ backing_object->alive = FALSE;
+ vm_object_unlock(backing_object);
+
+diff --git a/vm/vm_object.h b/vm/vm_object.h
+index 96bfbac..eb8a0c2 100644
+--- a/vm/vm_object.h
++++ b/vm/vm_object.h
+@@ -148,8 +148,9 @@ struct vm_object {
+ */
+ /* boolean_t */ use_shared_copy : 1,/* Use shared (i.e.,
+ * delayed) copy on write */
+- /* boolean_t */ shadowed: 1; /* Shadow may exist */
++ /* boolean_t */ shadowed: 1, /* Shadow may exist */
+
++ /* boolean_t */ cached: 1; /* Object is cached */
+ queue_chain_t cached_list; /* Attachment point for the list
+ * of objects cached as a result
+ * of their can_persist value
+--
+2.1.4
+