Re: [RFC PATCH 12/15] sched/task_stack: Introduce ARCH_HAS_VARIABLE_STACK_SIZE
flat view
From: Randy Dunlap <rdunlap@infradead.org>
Date: 2026-09-28 20:37:47
Also in:
linux-doc, linux-hardening, linux-mm, linux-rt-devel, lkml
On 9/28/26 10:41 AM, Mostafa Saleh wrote:
quoted hunk ↗ jump to hunk
When CONFIG_ARCH_HAS_VARIABLE_STACK_SIZE is enabled, the kernel stack may not be fully populated with the THREAD_SIZE virtual area. Teach task_stack_size() to return the size of the vm area and not a fixed size. This propagates to end_of_stack() which makes functions like stack_not_used() and set_task_stack_end_magic() to use the lowest valid stack address instead of THREAD_SIZE which would cause data aborts. Signed-off-by: Mostafa Saleh <smostafa@google.com> --- arch/Kconfig | 10 ++++++++++ include/linux/sched/task_stack.h | 5 +++++ 2 files changed, 15 insertions(+)diff --git a/arch/Kconfig b/arch/Kconfig index 45c657772362..d6fa2ccb0599 100644 --- a/arch/Kconfig +++ b/arch/Kconfig@@ -431,6 +431,16 @@ config HAVE_ASM_MODVERSIONS <asm/asm-prototypes.h> to support the module versioning for symbols exported from assembly code. +config ARCH_HAS_VARIABLE_STACK_SIZE + bool + depends on VMAP_STACK + depends on !STACK_GROWSUP + depends on THREAD_INFO_IN_TASK + help + An arch should select this if it supports dynamically configuring the + kernel stack size. + For example the kernel stack size can be from the command line.
can be set from the command line. ?
quoted hunk ↗ jump to hunk
+ config HAVE_REGS_AND_STACK_ACCESS_API bool helpdiff --git a/include/linux/sched/task_stack.h b/include/linux/sched/task_stack.h index 4a808f9c4631..07d73adaecd1 100644 --- a/include/linux/sched/task_stack.h +++ b/include/linux/sched/task_stack.h@@ -10,6 +10,7 @@ #include <linux/magic.h> #include <linux/refcount.h> #include <linux/kasan.h> +#include <linux/vmalloc.h> #ifdef CONFIG_THREAD_INFO_IN_TASK@@ -96,6 +97,10 @@ static inline unsigned long *end_of_stack(const struct task_struct *p) */ static __always_inline unsigned long task_stack_size(const struct task_struct *task) { +#ifdef CONFIG_ARCH_HAS_VARIABLE_STACK_SIZE + if (task->stack_vm_area) + return task->stack_vm_area->nr_pages * PAGE_SIZE; +#endif return THREAD_SIZE; }
-- ~Randy