diff options
Diffstat (limited to 'debian/patches/upstreamme0005-kern-remove-the-list-of-free-stacks.patch')
-rw-r--r-- | debian/patches/upstreamme0005-kern-remove-the-list-of-free-stacks.patch | 270 |
1 files changed, 0 insertions, 270 deletions
diff --git a/debian/patches/upstreamme0005-kern-remove-the-list-of-free-stacks.patch b/debian/patches/upstreamme0005-kern-remove-the-list-of-free-stacks.patch deleted file mode 100644 index b1727c4..0000000 --- a/debian/patches/upstreamme0005-kern-remove-the-list-of-free-stacks.patch +++ /dev/null @@ -1,270 +0,0 @@ -From 13a4d09db07487d56ddc0667779cb8e0fe85a912 Mon Sep 17 00:00:00 2001 -From: Justus Winter <4winter@informatik.uni-hamburg.de> -Date: Fri, 3 Jul 2015 12:41:48 +0200 -Subject: [PATCH gnumach 5/5] kern: remove the list of free stacks - -* kern/counters.c: Remove relevant counters. -* kern/counters.h: Likewise. -* kern/thread.c (stack_free_{list,count,limit}): Drop variables. -(stack_next): Remove macro. -(stack_alloc_try): Allocate stack using the slab allocator. -(stack_alloc): Merely call `stack_alloc_try'. -(stack_free): Adopt accordingly. ---- - kern/counters.c | 3 -- - kern/counters.h | 3 -- - kern/thread.c | 145 ++++++-------------------------------------------------- - 3 files changed, 14 insertions(+), 137 deletions(-) - -diff --git a/kern/counters.c b/kern/counters.c -index 0a0665b..74fd42d 100644 ---- a/kern/counters.c -+++ b/kern/counters.c -@@ -46,9 +46,6 @@ mach_counter_t c_stacks_current = 0; - mach_counter_t c_stacks_max = 0; - mach_counter_t c_stacks_min = 0; - mach_counter_t c_stacks_total = 0; --mach_counter_t c_stack_alloc_hits = 0; --mach_counter_t c_stack_alloc_misses = 0; --mach_counter_t c_stack_alloc_max = 0; - mach_counter_t c_clock_ticks = 0; - mach_counter_t c_ipc_mqueue_send_block = 0; - mach_counter_t c_ipc_mqueue_receive_block_user = 0; -diff --git a/kern/counters.h b/kern/counters.h -index aa1e739..bfa9b44 100644 ---- a/kern/counters.h -+++ b/kern/counters.h -@@ -69,9 +69,6 @@ extern mach_counter_t c_stacks_current; - extern mach_counter_t c_stacks_max; - extern mach_counter_t c_stacks_min; - extern mach_counter_t c_stacks_total; --extern mach_counter_t c_stack_alloc_hits; --extern mach_counter_t c_stack_alloc_misses; --extern mach_counter_t c_stack_alloc_max; - extern mach_counter_t c_clock_ticks; - extern mach_counter_t c_ipc_mqueue_send_block; - extern mach_counter_t c_ipc_mqueue_receive_block_user; -diff --git a/kern/thread.c b/kern/thread.c -index 36a5a92..f6e3021 100644 ---- a/kern/thread.c -+++ b/kern/thread.c -@@ -101,8 +101,6 @@ vm_size_t stack_max_usage = 0; - * stack_free - * stack_handoff - * stack_collect -- * and if MACH_DEBUG: -- * stack_statistics - */ - #else /* MACHINE_STACK */ - /* -@@ -120,16 +118,10 @@ decl_simple_lock_data(, stack_lock_data)/* splsched only */ - #define stack_lock() simple_lock(&stack_lock_data) - #define stack_unlock() simple_unlock(&stack_lock_data) - --vm_offset_t stack_free_list; /* splsched only */ --unsigned int stack_free_count = 0; /* splsched only */ --unsigned int stack_free_limit = 1; /* patchable */ -- - /* -- * The next field is at the base of the stack, -- * so the low end is left unsullied. -+ * We allocate kernel stacks using the slab allocator. - */ -- --#define stack_next(stack) (*((vm_offset_t *)((stack) + KERNEL_STACK_SIZE) - 1)) -+static struct kmem_cache stack_cache; - - /* - * stack_alloc_try: -@@ -144,73 +136,37 @@ boolean_t stack_alloc_try( - { - vm_offset_t stack; - -- stack_lock(); -- stack = stack_free_list; -- if (stack != 0) { -- stack_free_list = stack_next(stack); -- stack_free_count--; -- } else { -+ stack = kmem_cache_alloc(&stack_cache); -+ assert ((stack & (KERNEL_STACK_SIZE-1)) == 0); -+ -+#if MACH_DEBUG -+ if (stack) -+ stack_init(stack); -+#endif /* MACH_DEBUG */ -+ if (! stack) - stack = thread->stack_privilege; -- } -- stack_unlock(); - - if (stack != 0) { - stack_attach(thread, stack, resume); -- counter(c_stack_alloc_hits++); - return TRUE; - } else { -- counter(c_stack_alloc_misses++); - return FALSE; - } - } - - /* -- * We allocate kernel stacks using the slab allocator. -- */ --static struct kmem_cache stack_cache; -- --/* - * stack_alloc: - * - * Allocate a kernel stack for a thread. -- * May block. - */ - - kern_return_t stack_alloc( - thread_t thread, - void (*resume)(thread_t)) - { -- vm_offset_t stack; -- spl_t s; -- -- /* -- * We first try the free list. It is probably empty, -- * or stack_alloc_try would have succeeded, but possibly -- * a stack was freed before the swapin thread got to us. -- */ -- -- s = splsched(); -- stack_lock(); -- stack = stack_free_list; -- if (stack != 0) { -- stack_free_list = stack_next(stack); -- stack_free_count--; -- } -- stack_unlock(); -- (void) splx(s); -- -- if (stack == 0) { -- stack = kmem_cache_alloc(&stack_cache); -- assert ((stack & (KERNEL_STACK_SIZE-1)) == 0); -- if (stack == 0) -- return KERN_RESOURCE_SHORTAGE; -- --#if MACH_DEBUG -- stack_init(stack); --#endif /* MACH_DEBUG */ -- } -+ if (! stack_alloc_try (thread, resume)) -+ return KERN_RESOURCE_SHORTAGE; - -- stack_attach(thread, stack, resume); - return KERN_SUCCESS; - } - -@@ -228,17 +184,8 @@ void stack_free( - - stack = stack_detach(thread); - -- if (stack != thread->stack_privilege) { -- stack_lock(); -- stack_next(stack) = stack_free_list; -- stack_free_list = stack; -- stack_free_count += 1; --#if MACH_COUNTERS -- if (stack_free_count > c_stack_alloc_max) -- c_stack_alloc_max = stack_free_count; --#endif /* MACH_COUNTERS */ -- stack_unlock(); -- } -+ if (stack != thread->stack_privilege) -+ kmem_cache_free (&stack_cache, stack); - } - - /* -@@ -250,28 +197,6 @@ void stack_free( - - void stack_collect(void) - { -- vm_offset_t stack; -- spl_t s; -- -- s = splsched(); -- stack_lock(); -- while (stack_free_count > stack_free_limit) { -- stack = stack_free_list; -- stack_free_list = stack_next(stack); -- stack_free_count--; -- stack_unlock(); -- (void) splx(s); -- --#if MACH_DEBUG -- stack_finalize(stack); --#endif /* MACH_DEBUG */ -- kmem_cache_free(&stack_cache, stack); -- -- s = splsched(); -- stack_lock(); -- } -- stack_unlock(); -- (void) splx(s); - } - #endif /* MACHINE_STACK */ - -@@ -2382,46 +2307,6 @@ void stack_finalize( - } - } - --#ifndef MACHINE_STACK --/* -- * stack_statistics: -- * -- * Return statistics on cached kernel stacks. -- * *maxusagep must be initialized by the caller. -- */ -- --void stack_statistics( -- natural_t *totalp, -- vm_size_t *maxusagep) --{ -- spl_t s; -- -- s = splsched(); -- stack_lock(); -- if (stack_check_usage) { -- vm_offset_t stack; -- -- /* -- * This is pretty expensive to do at splsched, -- * but it only happens when someone makes -- * a debugging call, so it should be OK. -- */ -- -- for (stack = stack_free_list; stack != 0; -- stack = stack_next(stack)) { -- vm_size_t usage = stack_usage(stack); -- -- if (usage > *maxusagep) -- *maxusagep = usage; -- } -- } -- -- *totalp = stack_free_count; -- stack_unlock(); -- (void) splx(s); --} --#endif /* MACHINE_STACK */ -- - kern_return_t host_stack_usage( - host_t host, - vm_size_t *reservedp, -@@ -2441,8 +2326,6 @@ kern_return_t host_stack_usage( - maxusage = stack_max_usage; - simple_unlock(&stack_usage_lock); - -- stack_statistics(&total, &maxusage); -- - *reservedp = 0; - *totalp = total; - *spacep = *residentp = total * round_page(KERNEL_STACK_SIZE); --- -2.1.4 - |