diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-08-27 19:48:00 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-08-27 19:48:00 +0200 |
commit | 67ac13ead93a994cd02c175a9602a28f895c930c (patch) | |
tree | 0b2383778e212734e419e3671ce2f219259264a4 /debian | |
parent | 08b9024ae1c79edd1a5b77676538d6daf56c3b35 (diff) |
add patch series
Diffstat (limited to 'debian')
-rw-r--r-- | debian/patches/flavio0001-port-leak.patch.patch | 143 | ||||
-rw-r--r-- | debian/patches/flavio0002-no-continuation.patch.patch | 172 | ||||
-rw-r--r-- | debian/patches/series | 2 |
3 files changed, 317 insertions, 0 deletions
diff --git a/debian/patches/flavio0001-port-leak.patch.patch b/debian/patches/flavio0001-port-leak.patch.patch new file mode 100644 index 0000000..56a9640 --- /dev/null +++ b/debian/patches/flavio0001-port-leak.patch.patch @@ -0,0 +1,143 @@ +From 56388f20c50149991d5494f759c77dd7c3161dc4 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Thu, 27 Aug 2015 19:47:25 +0200 +Subject: [PATCH gnumach 1/2] port-leak.patch + +--- + kern/ast.c | 2 +- + kern/exception.c | 32 ++++++++++++++++++++++++++++---- + kern/profile.c | 2 +- + kern/thread.c | 4 ++-- + kern/thread.h | 2 +- + 5 files changed, 33 insertions(+), 9 deletions(-) + +diff --git a/kern/ast.c b/kern/ast.c +index 4b9d63d..2772ed3 100644 +--- a/kern/ast.c ++++ b/kern/ast.c +@@ -96,7 +96,7 @@ ast_taken(void) + if (self != current_processor()->idle_thread) { + #ifndef MIGRATING_THREADS + while (thread_should_halt(self)) +- thread_halt_self(); ++ thread_halt_self(thread_exception_return); + #endif + + /* +diff --git a/kern/exception.c b/kern/exception.c +index 6cb3bfb..63a63d6 100644 +--- a/kern/exception.c ++++ b/kern/exception.c +@@ -231,7 +231,7 @@ exception_no_server(void) + */ + + while (thread_should_halt(self)) +- thread_halt_self(); ++ thread_halt_self(thread_exception_return); + + + #if 0 +@@ -257,7 +257,7 @@ exception_no_server(void) + */ + + (void) task_terminate(self->task); +- thread_halt_self(); ++ thread_halt_self(thread_exception_return); + panic("terminating the task didn't kill us"); + /*NOTREACHED*/ + } +@@ -848,6 +848,26 @@ exception_raise_continue(void) + } + + /* ++ * Routine: thread_release_and_exception_return ++ * Purpose: ++ * Continue after thread was halted. ++ * Conditions: ++ * Nothing locked. We are running on a new kernel stack and ++ * control goes back to thread_exception_return. ++ * Returns: ++ * Doesn't return. ++ */ ++static void ++thread_release_and_exception_return(void) ++{ ++ ipc_thread_t self = current_thread(); ++ /* reply port must be released */ ++ ipc_port_release(self->ith_port); ++ thread_exception_return(); ++ /*NOTREACHED*/ ++} ++ ++/* + * Routine: exception_raise_continue_slow + * Purpose: + * Continue after finishing an ipc_mqueue_receive +@@ -876,10 +896,14 @@ exception_raise_continue_slow( + */ + + while (thread_should_halt(self)) { +- /* don't terminate while holding a reference */ ++ /* if thread is about to terminate, release the port */ + if (self->ast & AST_TERMINATE) + ipc_port_release(reply_port); +- thread_halt_self(); ++ /* ++ * Use the continuation to release the port in ++ * case the thread is about to halt. ++ */ ++ thread_halt_self(thread_release_and_exception_return); + } + + ip_lock(reply_port); +diff --git a/kern/profile.c b/kern/profile.c +index 5510721..1fd265f 100644 +--- a/kern/profile.c ++++ b/kern/profile.c +@@ -172,7 +172,7 @@ printf("profile_thread: mach_msg failed returned %x\n",(int)mr); + sizeof(struct buf_to_send)); + } + +- thread_halt_self(); ++ thread_halt_self(thread_exception_return); + } + + +diff --git a/kern/thread.c b/kern/thread.c +index 865a1cc..e524688 100644 +--- a/kern/thread.c ++++ b/kern/thread.c +@@ -1132,7 +1132,7 @@ void __attribute__((noreturn)) walking_zombie(void) + * Thread calls this routine on exit from the kernel when it + * notices a halt request. + */ +-void thread_halt_self(void) ++void thread_halt_self(continuation_t continuation) + { + thread_t thread = current_thread(); + spl_t s; +@@ -1173,7 +1173,7 @@ void thread_halt_self(void) + thread_unlock(thread); + splx(s); + counter(c_thread_halt_self_block++); +- thread_block(thread_exception_return); ++ thread_block(continuation); + /* + * thread_release resets TH_HALTED. + */ +diff --git a/kern/thread.h b/kern/thread.h +index 0e85d8c..22b12fa 100644 +--- a/kern/thread.h ++++ b/kern/thread.h +@@ -362,7 +362,7 @@ extern void thread_release(thread_t); + extern kern_return_t thread_halt( + thread_t thread, + boolean_t must_halt); +-extern void thread_halt_self(void); ++extern void thread_halt_self(continuation_t); + extern void thread_force_terminate(thread_t); + extern thread_t kernel_thread( + task_t task, +-- +2.1.4 + diff --git a/debian/patches/flavio0002-no-continuation.patch.patch b/debian/patches/flavio0002-no-continuation.patch.patch new file mode 100644 index 0000000..5fe2813 --- /dev/null +++ b/debian/patches/flavio0002-no-continuation.patch.patch @@ -0,0 +1,172 @@ +From 2b087e83630c2ee3bae765c8ae76c217b6eddd26 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Thu, 27 Aug 2015 19:47:38 +0200 +Subject: [PATCH gnumach 2/2] no-continuation.patch + +--- + kern/machine.c | 8 ++++---- + kern/profile.c | 2 +- + kern/sched_prim.c | 8 ++++---- + kern/sched_prim.h | 2 ++ + kern/task.c | 4 ++-- + kern/thread.c | 2 +- + kern/thread.h | 2 +- + 7 files changed, 15 insertions(+), 13 deletions(-) + +diff --git a/kern/machine.c b/kern/machine.c +index eced768..3f7a7f7 100644 +--- a/kern/machine.c ++++ b/kern/machine.c +@@ -270,7 +270,7 @@ Retry: + assert_wait((event_t) processor, TRUE); + processor_unlock(processor); + splx(s); +- thread_block((void(*)()) 0); ++ thread_block(thread_no_continuation); + goto Retry; + } + +@@ -299,7 +299,7 @@ Retry: + assert_wait((event_t)processor, TRUE); + processor_unlock(processor); + splx(s); +- thread_block((void (*)()) 0); ++ thread_block(thread_no_continuation); + s = splsched(); + processor_lock(processor); + } +@@ -415,7 +415,7 @@ void processor_doaction(processor_t processor) + */ + this_thread = current_thread(); + thread_bind(this_thread, processor); +- thread_block((void (*)()) 0); ++ thread_block(thread_no_continuation); + + pset = processor->processor_set; + #if MACH_HOST +@@ -572,7 +572,7 @@ Restart_pset: + thread_deallocate(prev_thread); + thread_bind(this_thread, PROCESSOR_NULL); + +- thread_block((void (*)()) 0); ++ thread_block(thread_no_continuation); + return; + } + +diff --git a/kern/profile.c b/kern/profile.c +index 1fd265f..1381b1a 100644 +--- a/kern/profile.c ++++ b/kern/profile.c +@@ -213,7 +213,7 @@ thread_t th; + thread_wakeup((event_t) profile_thread); + assert_wait((event_t) &buf_entry->wakeme, TRUE); + splx(s); +- thread_block((void (*)()) 0); ++ thread_block(thread_no_continuation); + } else { + splx(s); + kmem_free(kernel_map, vm_buf_entry, sizeof(struct buf_to_send)); +diff --git a/kern/sched_prim.c b/kern/sched_prim.c +index e8f260e..580ca43 100644 +--- a/kern/sched_prim.c ++++ b/kern/sched_prim.c +@@ -454,7 +454,7 @@ void thread_sleep( + { + assert_wait(event, interruptible); /* assert event */ + simple_unlock(lock); /* release the lock */ +- thread_block((void (*)()) 0); /* block ourselves */ ++ thread_block(thread_no_continuation); /* block ourselves */ + } + + /* +@@ -617,7 +617,7 @@ boolean_t thread_invoke( + thread_unlock(new_thread); + thread_wakeup(TH_EV_STATE(new_thread)); + +- if (continuation != (void (*)()) 0) { ++ if (continuation != thread_no_continuation) { + (void) spl0(); + call_continuation(continuation); + /*NOTREACHED*/ +@@ -630,7 +630,7 @@ boolean_t thread_invoke( + */ + thread_lock(new_thread); + if ((old_thread->stack_privilege != current_stack()) && +- (continuation != (void (*)()) 0)) ++ (continuation != thread_no_continuation)) + { + switch (new_thread->state & TH_SWAP_STATE) { + case TH_SWAPPED: +@@ -915,7 +915,7 @@ void thread_dispatch( + + thread_lock(thread); + +- if (thread->swap_func != (void (*)()) 0) { ++ if (thread->swap_func != thread_no_continuation) { + assert((thread->state & TH_SWAP_STATE) == 0); + thread->state |= TH_SWAPPED; + stack_free(thread); +diff --git a/kern/sched_prim.h b/kern/sched_prim.h +index 62698dc..bb1865c 100644 +--- a/kern/sched_prim.h ++++ b/kern/sched_prim.h +@@ -52,6 +52,8 @@ typedef void *event_t; /* wait event */ + + typedef void (*continuation_t)(void); /* continuation */ + ++#define thread_no_continuation ((continuation_t) 0) /* no continuation */ ++ + /* + * Exported interface to sched_prim.c. + */ +diff --git a/kern/task.c b/kern/task.c +index 9a3d848..e9e6ba2 100644 +--- a/kern/task.c ++++ b/kern/task.c +@@ -377,7 +377,7 @@ kern_return_t task_terminate( + task_unlock(task); + thread_force_terminate(thread); + thread_deallocate(thread); +- thread_block((void (*)()) 0); ++ thread_block(thread_no_continuation); + task_lock(task); + } + task_unlock(task); +@@ -893,7 +893,7 @@ task_assign( + task->assign_active = TRUE; + assert_wait((event_t)&task->assign_active, TRUE); + task_unlock(task); +- thread_block((void (*)()) 0); ++ thread_block(thread_no_continuation); + task_lock(task); + } + +diff --git a/kern/thread.c b/kern/thread.c +index e524688..3e90079 100644 +--- a/kern/thread.c ++++ b/kern/thread.c +@@ -1348,7 +1348,7 @@ kern_return_t thread_suspend( + while (thread->state & TH_UNINT) { + assert_wait(TH_EV_STATE(thread), TRUE); + thread_unlock(thread); +- thread_block(NULL); ++ thread_block(thread_no_continuation); + thread_lock(thread); + } + if (thread->user_stop_count++ == 0) { +diff --git a/kern/thread.h b/kern/thread.h +index 22b12fa..7106fd2 100644 +--- a/kern/thread.h ++++ b/kern/thread.h +@@ -100,7 +100,7 @@ struct thread { + vm_offset_t stack_privilege;/* reserved kernel stack */ + + /* Swapping information */ +- void (*swap_func)(); /* start here after swapin */ ++ continuation_t swap_func; /* start here after swapin */ + + /* Blocking information */ + event_t wait_event; /* event we are waiting on */ +-- +2.1.4 + diff --git a/debian/patches/series b/debian/patches/series index 40ca28c..8d39abe 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -15,3 +15,5 @@ fix-locking0005-ipc-fix-locking-issues.patch vm-cache-policy0001-VM-cache-policy-change.patch vm-cache-policy0002-vm-keep-track-of-clean-pages.patch vm-cache-policy0003-vm-evict-clean-pages-first.patch +flavio0001-port-leak.patch.patch +flavio0002-no-continuation.patch.patch |