Hey Andy- Small non-critical/potential future optimization comment below: On Thu, Aug 11, 2016 at 02:35:21AM -0700, Andy Lutomirski wrote: > If CONFIG_VMAP_STACK is selected, kernel stacks are allocated with > vmalloc_node. > > grsecurity has had a similar feature (called > GRKERNSEC_KSTACKOVERFLOW) for a long time. > > Cc: Oleg Nesterov > Signed-off-by: Andy Lutomirski > --- [..] > diff --git a/kernel/fork.c b/kernel/fork.c > index 52e725d4a866..05f7ef796fb4 100644 > --- a/kernel/fork.c > +++ b/kernel/fork.c > @@ -158,19 +158,39 @@ void __weak arch_release_thread_stack(unsigned long *stack) > * Allocate pages if THREAD_SIZE is >= PAGE_SIZE, otherwise use a > * kmemcache based allocator. > */ > -# if THREAD_SIZE >= PAGE_SIZE > -static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, > - int node) > +# if THREAD_SIZE >= PAGE_SIZE || defined(CONFIG_VMAP_STACK) > +static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node) > { > +#ifdef CONFIG_VMAP_STACK > + void *stack = __vmalloc_node_range(THREAD_SIZE, THREAD_SIZE, > + VMALLOC_START, VMALLOC_END, > + THREADINFO_GFP | __GFP_HIGHMEM, > + PAGE_KERNEL, > + 0, node, > + __builtin_return_address(0)); > + > + /* > + * We can't call find_vm_area() in interrupt context, and > + * free_thread_stack can be called in interrupt context, so cache > + * the vm_struct. > + */ > + if (stack) > + tsk->stack_vm_area = find_vm_area(stack); This is annoying, we end up having to walk the vm_area tree twice (once for the allocation, then here to get a handle on area). Perhaps it's time the vmalloc code learned an allocation API that returned the vm_area handle as well. Josh