summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.patch218
-rw-r--r--debian/patches/series3
4 files changed, 0 insertions, 373 deletions
diff --git a/debian/patches/0001-xxx-notes.patch b/debian/patches/0001-xxx-notes.patch
deleted file mode 100644
index c4e3679..0000000
--- a/debian/patches/0001-xxx-notes.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-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
deleted file mode 100644
index 857a675..0000000
--- a/debian/patches/0002-xxx-vm_page_queue_clean.patch
+++ /dev/null
@@ -1,113 +0,0 @@
-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
deleted file mode 100644
index e2b29a2..0000000
--- a/debian/patches/0003-xxx-vm_page_queue_clean.patch
+++ /dev/null
@@ -1,218 +0,0 @@
-From b176dda48436444f403443ae99379e11ad149104 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_pageout.c | 26 ++++++++++++++++++++------
- xen/block.c | 2 +-
- 8 files changed, 31 insertions(+), 17 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_pageout.c b/vm/vm_pageout.c
-index cee37ce..27193b0 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,21 @@ void vm_pageout_scan(void)
- /*NOTREACHED*/
- }
-
-- // xxx try to drop a clean page here
-+ /* Try to evict a clean page first. */
-+ simple_lock (&vm_page_queue_clean);
-+ m = (vm_page_t) queue_first (&vm_page_queue_clean);
-+ while (1) {
-+ if (!m->active && m->external) {
-+ simple_unlock (&vm_page_queue_clean);
-+ printf ("evicting page from clean list!!!\n");
-+ goto got_one;
-+ }
-+
-+ m = (vm_page_t) queue_next (&m->cleanq);
-+ if (!m)
-+ break;
-+ }
-+ simple_unlock (&vm_page_queue_clean);
-
- vm_pageout_inactive++;
-
-@@ -699,7 +713,7 @@ void vm_pageout_scan(void)
- if (!m)
- goto pause;
- }
--
-+ got_one:
- object = m->object;
-
- /*
-@@ -782,7 +796,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/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 db4f173..102e3c8 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -7,6 +7,3 @@
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