summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-08-27 19:48:00 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-08-27 19:48:00 +0200
commit67ac13ead93a994cd02c175a9602a28f895c930c (patch)
tree0b2383778e212734e419e3671ce2f219259264a4 /debian
parent08b9024ae1c79edd1a5b77676538d6daf56c3b35 (diff)
add patch series
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/flavio0001-port-leak.patch.patch143
-rw-r--r--debian/patches/flavio0002-no-continuation.patch.patch172
-rw-r--r--debian/patches/series2
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