diff options
-rw-r--r-- | debian/patches/0001-xxx-notes.patch | 39 | ||||
-rw-r--r-- | debian/patches/0002-xxx-vm_page_queue_clean.patch | 113 | ||||
-rw-r--r-- | debian/patches/0003-xxx-vm_page_queue_clean.patch | 218 | ||||
-rw-r--r-- | debian/patches/series | 3 |
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 |