| From: Pasha Tatashin <pasha.tatashin@soleen.com> |
| Subject: fork: clean up ifdef logic around stack allocation |
| Date: Wed, 18 Jun 2025 15:34:33 +0200 |
| |
| There is an unneeded OR in the ifdef functions that are used to allocate |
| and free kernel stacks based on direct map or vmap. Adding dynamic stack |
| support would complicate this logic even further. |
| |
| Therefore, clean up by changing the order so OR is no longer needed. |
| |
| Link: https://lkml.kernel.org/r/20250618-fork-fixes-v4-1-2e05a2e1f5fc@linaro.org |
| Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com> |
| Link: https://lore.kernel.org/20240311164638.2015063-3-pasha.tatashin@soleen.com |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Cc: Mateusz Guzik <mjguzik@gmail.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| kernel/fork.c | 22 +++++++++++----------- |
| 1 file changed, 11 insertions(+), 11 deletions(-) |
| |
| --- a/kernel/fork.c~fork-clean-up-ifdef-logic-around-stack-allocation |
| +++ a/kernel/fork.c |
| @@ -188,13 +188,7 @@ static inline void free_task_struct(stru |
| kmem_cache_free(task_struct_cachep, tsk); |
| } |
| |
| -/* |
| - * Allocate pages if THREAD_SIZE is >= PAGE_SIZE, otherwise use a |
| - * kmemcache based allocator. |
| - */ |
| -# if THREAD_SIZE >= PAGE_SIZE || defined(CONFIG_VMAP_STACK) |
| - |
| -# ifdef CONFIG_VMAP_STACK |
| +#ifdef CONFIG_VMAP_STACK |
| /* |
| * vmalloc() is a bit slow, and calling vfree() enough times will force a TLB |
| * flush. Try to minimize the number of calls by caching stacks. |
| @@ -344,7 +338,13 @@ static void free_thread_stack(struct tas |
| tsk->stack_vm_area = NULL; |
| } |
| |
| -# else /* !CONFIG_VMAP_STACK */ |
| +#else /* !CONFIG_VMAP_STACK */ |
| + |
| +/* |
| + * Allocate pages if THREAD_SIZE is >= PAGE_SIZE, otherwise use a |
| + * kmemcache based allocator. |
| + */ |
| +#if THREAD_SIZE >= PAGE_SIZE |
| |
| static void thread_stack_free_rcu(struct rcu_head *rh) |
| { |
| @@ -376,8 +376,7 @@ static void free_thread_stack(struct tas |
| tsk->stack = NULL; |
| } |
| |
| -# endif /* CONFIG_VMAP_STACK */ |
| -# else /* !(THREAD_SIZE >= PAGE_SIZE || defined(CONFIG_VMAP_STACK)) */ |
| +#else /* !(THREAD_SIZE >= PAGE_SIZE) */ |
| |
| static struct kmem_cache *thread_stack_cache; |
| |
| @@ -416,7 +415,8 @@ void thread_stack_cache_init(void) |
| BUG_ON(thread_stack_cache == NULL); |
| } |
| |
| -# endif /* THREAD_SIZE >= PAGE_SIZE || defined(CONFIG_VMAP_STACK) */ |
| +#endif /* THREAD_SIZE >= PAGE_SIZE */ |
| +#endif /* CONFIG_VMAP_STACK */ |
| |
| /* SLAB cache for signal_struct structures (tsk->signal) */ |
| static struct kmem_cache *signal_cachep; |
| _ |