diff options
-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, 0 insertions, 317 deletions
diff --git a/debian/patches/flavio0001-port-leak.patch.patch b/debian/patches/flavio0001-port-leak.patch.patch deleted file mode 100644 index 56a9640..0000000 --- a/debian/patches/flavio0001-port-leak.patch.patch +++ /dev/null @@ -1,143 +0,0 @@ -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 deleted file mode 100644 index 5fe2813..0000000 --- a/debian/patches/flavio0002-no-continuation.patch.patch +++ /dev/null @@ -1,172 +0,0 @@ -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 8d39abe..40ca28c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -15,5 +15,3 @@ 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 |