summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-02-21 12:52:06 +0100
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-02-21 12:52:06 +0100
commit28264cc3eecd0c8999b957fba03d8ab6757d9cea (patch)
tree25f657e4fad275cde7b23ae129e42c3399253fcb /debian
parentee6fefbce91a1eefe88d8336fa09e45b1966c341 (diff)
add patch series
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/0001-xxx-notes.patch39
-rw-r--r--debian/patches/0002-xxx-vm_page_queue_clean.patch113
-rw-r--r--debian/patches/0003-xxx-vm_page_queue_clean.patch283
-rw-r--r--debian/patches/series3
4 files changed, 438 insertions, 0 deletions
diff --git a/debian/patches/0001-xxx-notes.patch b/debian/patches/0001-xxx-notes.patch
new file mode 100644
index 0000000..c4e3679
--- /dev/null
+++ b/debian/patches/0001-xxx-notes.patch
@@ -0,0 +1,39 @@
+From 2262aec645a8bb431a6acf76624fd01468ca0715 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sat, 21 Feb 2015 00:05:31 +0100
+Subject: [PATCH gnumach 1/3] xxx notes
+
+---
+ vm/vm_pageout.c | 2 ++
+ vm/vm_resident.c | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/vm/vm_pageout.c b/vm/vm_pageout.c
+index c4aba96..cee37ce 100644
+--- a/vm/vm_pageout.c
++++ b/vm/vm_pageout.c
+@@ -681,6 +681,8 @@ void vm_pageout_scan(void)
+ /*NOTREACHED*/
+ }
+
++ // xxx try to drop a clean page here
++
+ vm_pageout_inactive++;
+
+ /* Find a page we are interested in paging out. If we
+diff --git a/vm/vm_resident.c b/vm/vm_resident.c
+index b65b756..92b2397 100644
+--- a/vm/vm_resident.c
++++ b/vm/vm_resident.c
+@@ -666,7 +666,7 @@ void vm_page_remove(
+ bucket->pages = mem->next;
+ } else {
+ vm_page_t *prev;
+-
++ // XXX linear scan
+ for (prev = &this->next;
+ (this = *prev) != mem;
+ prev = &this->next)
+--
+2.1.4
+
diff --git a/debian/patches/0002-xxx-vm_page_queue_clean.patch b/debian/patches/0002-xxx-vm_page_queue_clean.patch
new file mode 100644
index 0000000..857a675
--- /dev/null
+++ b/debian/patches/0002-xxx-vm_page_queue_clean.patch
@@ -0,0 +1,113 @@
+From c3f9932330e1803d9c7373ca3db69557b716f359 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sat, 21 Feb 2015 00:54:05 +0100
+Subject: [PATCH gnumach 2/3] xxx vm_page_queue_clean
+
+---
+ vm/vm_page.h | 27 +++++++++++++++++++++++++--
+ vm/vm_resident.c | 5 +++++
+ 2 files changed, 30 insertions(+), 2 deletions(-)
+
+diff --git a/vm/vm_page.h b/vm/vm_page.h
+index 4fe1b41..6d2dbd9 100644
+--- a/vm/vm_page.h
++++ b/vm/vm_page.h
+@@ -70,8 +70,10 @@
+ * and sundry status bits.
+ *
+ * Fields in this structure are locked either by the lock on the
+- * object that the page belongs to (O) or by the lock on the page
+- * queues (P). [Some fields require that both locks be held to
++ * object that the page belongs to (O), by the lock on the page
++ * queues (P), or by vm_page_queue_clean_lock (C).
++ *
++ * [Some fields require that both locks, O and P, be held to
+ * change that field; holding either lock is sufficient to read.]
+ */
+
+@@ -79,6 +81,7 @@ struct vm_page {
+ queue_chain_t pageq; /* queue info for FIFO
+ * queue or free list (P) */
+ queue_chain_t listq; /* all pages in same object (O) */
++ queue_chain_t cleanq; /* all clean pages (C) */
+ struct vm_page *next; /* VP bucket link (O) */
+
+ vm_object_t object; /* which object am I in (O,P) */
+@@ -147,6 +150,8 @@ extern
+ queue_head_t vm_page_queue_active; /* active memory queue */
+ extern
+ queue_head_t vm_page_queue_inactive; /* inactive memory queue */
++extern
++queue_head_t vm_page_queue_clean; /* clean memory queue */
+
+ extern
+ int vm_page_free_count; /* How many pages are free? */
+@@ -184,6 +189,8 @@ decl_simple_lock_data(extern,vm_page_queue_lock)/* lock on active and inactive
+ page queues */
+ decl_simple_lock_data(extern,vm_page_queue_free_lock)
+ /* lock on free page queue */
++decl_simple_lock_data(extern,vm_page_queue_clean_lock)
++ /* lock on clean page queue */
+
+ extern unsigned int vm_page_free_wanted;
+ /* how many threads are waiting for memory */
+@@ -312,4 +319,20 @@ extern unsigned int vm_page_info(
+ } \
+ MACRO_END
+
++static inline void
++vm_page_mark_dirty (vm_page_t m, boolean_t dirty)
++{
++ if (m->dirty == dirty)
++ return;
++
++ simple_lock (&vm_page_queue_clean_lock);
++ if (dirty && m->cleanq.next) {
++ queue_remove (&vm_page_queue_clean, m, vm_page_t, cleanq);
++ m->cleanq.next = NULL;
++ }
++ if (! dirty)
++ queue_enter (&vm_page_queue_clean, m, vm_page_t, cleanq);
++ simple_unlock (&vm_page_queue_clean_lock);
++}
++
+ #endif /* _VM_VM_PAGE_H_ */
+diff --git a/vm/vm_resident.c b/vm/vm_resident.c
+index 92b2397..49ef148 100644
+--- a/vm/vm_resident.c
++++ b/vm/vm_resident.c
+@@ -148,6 +148,8 @@ vm_offset_t vm_page_fictitious_addr = (vm_offset_t) -1;
+ queue_head_t vm_page_queue_active;
+ queue_head_t vm_page_queue_inactive;
+ decl_simple_lock_data(,vm_page_queue_lock)
++queue_head_t vm_page_queue_clean;
++decl_simple_lock_data(,vm_page_queue_clean_lock)
+ int vm_page_active_count;
+ int vm_page_inactive_count;
+ int vm_page_wire_count;
+@@ -200,6 +202,7 @@ void vm_page_bootstrap(
+ */
+
+ m = &vm_page_template;
++ m->cleanq.next = NULL;
+ m->object = VM_OBJECT_NULL; /* reset later */
+ m->offset = 0; /* reset later */
+ m->wire_count = 0;
+@@ -231,12 +234,14 @@ void vm_page_bootstrap(
+ */
+
+ simple_lock_init(&vm_page_queue_free_lock);
++ simple_lock_init(&vm_page_queue_clean_lock);
+ simple_lock_init(&vm_page_queue_lock);
+
+ vm_page_queue_free = VM_PAGE_NULL;
+ vm_page_queue_fictitious = VM_PAGE_NULL;
+ queue_init(&vm_page_queue_active);
+ queue_init(&vm_page_queue_inactive);
++ queue_init(&vm_page_queue_clean);
+
+ vm_page_free_wanted = 0;
+
+--
+2.1.4
+
diff --git a/debian/patches/0003-xxx-vm_page_queue_clean.patch b/debian/patches/0003-xxx-vm_page_queue_clean.patch
new file mode 100644
index 0000000..7ede5bc
--- /dev/null
+++ b/debian/patches/0003-xxx-vm_page_queue_clean.patch
@@ -0,0 +1,283 @@
+From 6c0e9705027efc58e24a038566ef07388069a340 Mon Sep 17 00:00:00 2001
+From: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sat, 21 Feb 2015 01:13:16 +0100
+Subject: [PATCH gnumach 3/3] xxx vm_page_queue_clean
+
+---
+ linux/dev/glue/block.c | 2 +-
+ vm/memory_object.c | 4 ++--
+ vm/vm_debug.c | 2 +-
+ vm/vm_fault.c | 6 +++---
+ vm/vm_map.c | 2 +-
+ vm/vm_object.c | 4 ++--
+ vm/vm_page.h | 12 +++++++++---
+ vm/vm_pageout.c | 28 ++++++++++++++++++++++------
+ vm/vm_resident.c | 5 +++++
+ xen/block.c | 2 +-
+ 10 files changed, 47 insertions(+), 20 deletions(-)
+
+diff --git a/linux/dev/glue/block.c b/linux/dev/glue/block.c
+index da4ef38..3bd2c5b 100644
+--- a/linux/dev/glue/block.c
++++ b/linux/dev/glue/block.c
+@@ -1537,7 +1537,7 @@ device_read (void *d, ipc_port_t reply_port,
+ if (dirty)
+ {
+ PAGE_WAKEUP_DONE (m);
+- m->dirty = TRUE;
++ vm_page_mark_dirty (m, TRUE);
+ vm_page_insert (m, object, o);
+ }
+ else
+diff --git a/vm/memory_object.c b/vm/memory_object.c
+index 097ed23..7a0dbb8 100644
+--- a/vm/memory_object.c
++++ b/vm/memory_object.c
+@@ -209,7 +209,7 @@ retry_lookup:
+ */
+
+ data_m->busy = FALSE;
+- data_m->dirty = FALSE;
++ vm_page_mark_dirty (data_m, FALSE);
+ pmap_clear_modify(data_m->phys_addr);
+
+ data_m->page_lock = lock_value;
+@@ -555,7 +555,7 @@ memory_object_lock_result_t memory_object_lock_page(
+ */
+
+ if (!m->dirty)
+- m->dirty = pmap_is_modified(m->phys_addr);
++ vm_page_mark_dirty (m, pmap_is_modified(m->phys_addr));
+
+ if (m->dirty || (m->precious &&
+ should_return == MEMORY_OBJECT_RETURN_ALL)) {
+diff --git a/vm/vm_debug.c b/vm/vm_debug.c
+index 227090e..822ca86 100644
+--- a/vm/vm_debug.c
++++ b/vm/vm_debug.c
+@@ -352,7 +352,7 @@ mach_vm_object_pages(
+ if (((state & (VPI_STATE_NODATA|VPI_STATE_DIRTY)) == 0) &&
+ pmap_is_modified(p->phys_addr)) {
+ state |= VPI_STATE_DIRTY;
+- p->dirty = TRUE;
++ vm_page_mark_dirty (p, TRUE);
+ }
+
+ vm_page_lock_queues();
+diff --git a/vm/vm_fault.c b/vm/vm_fault.c
+index 686156c..a48902a 100644
+--- a/vm/vm_fault.c
++++ b/vm/vm_fault.c
+@@ -978,7 +978,7 @@ vm_fault_return_t vm_fault_page(
+
+ vm_page_lock_queues();
+ pmap_page_protect(m->phys_addr, VM_PROT_NONE);
+- copy_m->dirty = TRUE;
++ vm_page_mark_dirty (copy_m, TRUE);
+ vm_page_unlock_queues();
+
+ /*
+@@ -1077,7 +1077,7 @@ vm_fault_return_t vm_fault_page(
+ */
+
+ if (vm_fault_dirty_handling && (*protection & VM_PROT_WRITE))
+- m->dirty = TRUE;
++ vm_page_mark_dirty (m, TRUE);
+
+ return(VM_FAULT_SUCCESS);
+
+@@ -1957,7 +1957,7 @@ kern_return_t vm_fault_copy(
+ vm_page_zero_fill(dst_page);
+ else
+ vm_page_copy(src_page, dst_page);
+- dst_page->dirty = TRUE;
++ vm_page_mark_dirty (dst_page, TRUE);
+
+ /*
+ * Unlock everything, and return
+diff --git a/vm/vm_map.c b/vm/vm_map.c
+index 6b13724..c229df5 100644
+--- a/vm/vm_map.c
++++ b/vm/vm_map.c
+@@ -2931,7 +2931,7 @@ insert_pages:
+ assert(!m->wanted);
+
+ m->busy = FALSE;
+- m->dirty = TRUE;
++ vm_page_mark_dirty (m, TRUE);
+ vm_page_replace(m, object, old_last_offset + offset);
+ if (must_wire) {
+ vm_page_wire(m);
+diff --git a/vm/vm_object.c b/vm/vm_object.c
+index a96516c..f7d8fd2 100644
+--- a/vm/vm_object.c
++++ b/vm/vm_object.c
+@@ -587,7 +587,7 @@ void vm_object_terminate(
+ panic("vm_object_terminate.4 0x%x 0x%x", object, p);
+
+ if (!p->dirty)
+- p->dirty = pmap_is_modified(p->phys_addr);
++ vm_page_mark_dirty (p, pmap_is_modified(p->phys_addr));
+
+ if (p->dirty || p->precious) {
+ p->busy = TRUE;
+@@ -1089,7 +1089,7 @@ kern_return_t vm_object_copy_slowly(
+ */
+
+ new_page->busy = FALSE;
+- new_page->dirty = TRUE;
++ vm_page_mark_dirty (new_page, TRUE);
+ vm_object_lock(result_page->object);
+ PAGE_WAKEUP_DONE(result_page);
+
+diff --git a/vm/vm_page.h b/vm/vm_page.h
+index 6d2dbd9..729ad8e 100644
+--- a/vm/vm_page.h
++++ b/vm/vm_page.h
+@@ -154,6 +154,8 @@ extern
+ queue_head_t vm_page_queue_clean; /* clean memory queue */
+
+ extern
++int vm_page_clean_count; /* How many pages are clean? */
++extern
+ int vm_page_free_count; /* How many pages are free? */
+ extern
+ int vm_page_fictitious_count;/* How many fictitious pages are free? */
+@@ -322,17 +324,21 @@ extern unsigned int vm_page_info(
+ static inline void
+ vm_page_mark_dirty (vm_page_t m, boolean_t dirty)
+ {
+- if (m->dirty == dirty)
+- return;
++ if (m->dirty == dirty && (dirty || m->cleanq.next))
++ return; /* No action necessary. */
+
+ simple_lock (&vm_page_queue_clean_lock);
+ if (dirty && m->cleanq.next) {
+ queue_remove (&vm_page_queue_clean, m, vm_page_t, cleanq);
++ vm_page_clean_count -= 1;
+ m->cleanq.next = NULL;
+ }
+- if (! dirty)
++ if (! dirty) {
+ queue_enter (&vm_page_queue_clean, m, vm_page_t, cleanq);
++ vm_page_clean_count += 1;
++ }
+ simple_unlock (&vm_page_queue_clean_lock);
++ m->dirty = dirty;
+ }
+
+ #endif /* _VM_VM_PAGE_H_ */
+diff --git a/vm/vm_pageout.c b/vm/vm_pageout.c
+index cee37ce..80a2f1b 100644
+--- a/vm/vm_pageout.c
++++ b/vm/vm_pageout.c
+@@ -293,7 +293,7 @@ vm_pageout_setup(
+ vm_page_insert(m, new_object, new_offset);
+ vm_page_unlock_queues();
+
+- m->dirty = TRUE;
++ vm_page_mark_dirty (m, TRUE);
+ m->precious = FALSE;
+ m->page_lock = VM_PROT_NONE;
+ m->unlock_request = VM_PROT_NONE;
+@@ -306,7 +306,7 @@ vm_pageout_setup(
+ vm_page_copy(m, new_m);
+
+ vm_object_lock(old_object);
+- m->dirty = FALSE;
++ vm_page_mark_dirty (m, FALSE);
+ pmap_clear_modify(m->phys_addr);
+
+ /*
+@@ -336,7 +336,7 @@ vm_pageout_setup(
+ * Use the new page below.
+ */
+ m = new_m;
+- m->dirty = TRUE;
++ vm_page_mark_dirty (m, TRUE);
+ assert(!m->precious);
+ PAGE_WAKEUP_DONE(m);
+ }
+@@ -681,7 +681,23 @@ void vm_pageout_scan(void)
+ /*NOTREACHED*/
+ }
+
+- // xxx try to drop a clean page here
++ //printf ("trying to evict page from clean list (%d pages clean)\n", vm_page_clean_count);
++ /* Try to evict a clean page first. */
++ simple_lock (&vm_page_queue_clean);
++ while (! 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++;
+
+@@ -699,7 +715,7 @@ void vm_pageout_scan(void)
+ if (!m)
+ goto pause;
+ }
+-
++ got_one:
+ object = m->object;
+
+ /*
+@@ -782,7 +798,7 @@ void vm_pageout_scan(void)
+ m->busy = TRUE;
+ pmap_page_protect(m->phys_addr, VM_PROT_NONE);
+ if (!m->dirty)
+- m->dirty = pmap_is_modified(m->phys_addr);
++ vm_page_mark_dirty (m, pmap_is_modified(m->phys_addr));
+
+ if (m->external) {
+ /* Figure out if we still care about this
+diff --git a/vm/vm_resident.c b/vm/vm_resident.c
+index 49ef148..0e490b5 100644
+--- a/vm/vm_resident.c
++++ b/vm/vm_resident.c
+@@ -153,6 +153,7 @@ decl_simple_lock_data(,vm_page_queue_clean_lock)
+ int vm_page_active_count;
+ int vm_page_inactive_count;
+ int vm_page_wire_count;
++int vm_page_clean_count;
+
+ /*
+ * Several page replacement parameters are also
+@@ -1309,6 +1310,10 @@ void vm_page_free(
+ if (mem->absent)
+ vm_object_absent_release(mem->object);
+
++
++ /* Get it off the clean list. */
++ vm_page_mark_dirty (mem, TRUE);
++
+ /*
+ * XXX The calls to vm_page_init here are
+ * really overkill.
+diff --git a/xen/block.c b/xen/block.c
+index d98b31e..175955a 100644
+--- a/xen/block.c
++++ b/xen/block.c
+@@ -539,7 +539,7 @@ device_read (void *d, ipc_port_t reply_port,
+ assert (m->busy);
+ vm_page_lock_queues ();
+ PAGE_WAKEUP_DONE (m);
+- m->dirty = TRUE;
++ vm_page_mark_dirty (m, TRUE);
+ vm_page_insert (m, object, o);
+ vm_page_unlock_queues ();
+ o += PAGE_SIZE;
+--
+2.1.4
+
diff --git a/debian/patches/series b/debian/patches/series
index 102e3c8..db4f173 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -7,3 +7,6 @@
Add-some-padding-to-make-objects-fit-a-single-cache-.patch
vm_cache_policy.patch
task-load.patch
+0001-xxx-notes.patch
+0002-xxx-vm_page_queue_clean.patch
+0003-xxx-vm_page_queue_clean.patch