Skip to content

Commit 7865aba

Browse files
Sebastian Andrzej SiewiorKAGA-KOKO
authored andcommitted
fork: Don't assign the stack pointer in dup_task_struct()
All four versions of alloc_thread_stack_node() assign now task_struct::stack in case the allocation was successful. Let alloc_thread_stack_node() return an error code instead of the stack pointer and remove the stack assignment in dup_task_struct(). Signed-off-by: Sebastian Andrzej Siewior <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Acked-by: Andy Lutomirski <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 2bb0529 commit 7865aba

File tree

1 file changed

+16
-31
lines changed

1 file changed

+16
-31
lines changed

kernel/fork.c

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ static int free_vm_stack_cache(unsigned int cpu)
211211
return 0;
212212
}
213213

214-
static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
214+
static int alloc_thread_stack_node(struct task_struct *tsk, int node)
215215
{
216216
void *stack;
217217
int i;
@@ -232,7 +232,7 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
232232

233233
tsk->stack_vm_area = s;
234234
tsk->stack = s->addr;
235-
return s->addr;
235+
return 0;
236236
}
237237

238238
/*
@@ -245,17 +245,16 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
245245
THREADINFO_GFP & ~__GFP_ACCOUNT,
246246
PAGE_KERNEL,
247247
0, node, __builtin_return_address(0));
248-
248+
if (!stack)
249+
return -ENOMEM;
249250
/*
250251
* We can't call find_vm_area() in interrupt context, and
251252
* free_thread_stack() can be called in interrupt context,
252253
* so cache the vm_struct.
253254
*/
254-
if (stack) {
255-
tsk->stack_vm_area = find_vm_area(stack);
256-
tsk->stack = stack;
257-
}
258-
return stack;
255+
tsk->stack_vm_area = find_vm_area(stack);
256+
tsk->stack = stack;
257+
return 0;
259258
}
260259

261260
static void free_thread_stack(struct task_struct *tsk)
@@ -282,16 +281,16 @@ static void free_thread_stack(struct task_struct *tsk)
282281

283282
# else /* !CONFIG_VMAP_STACK */
284283

285-
static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
284+
static int alloc_thread_stack_node(struct task_struct *tsk, int node)
286285
{
287286
struct page *page = alloc_pages_node(node, THREADINFO_GFP,
288287
THREAD_SIZE_ORDER);
289288

290289
if (likely(page)) {
291290
tsk->stack = kasan_reset_tag(page_address(page));
292-
return tsk->stack;
291+
return 0;
293292
}
294-
return NULL;
293+
return -ENOMEM;
295294
}
296295

297296
static void free_thread_stack(struct task_struct *tsk)
@@ -305,14 +304,13 @@ static void free_thread_stack(struct task_struct *tsk)
305304

306305
static struct kmem_cache *thread_stack_cache;
307306

308-
static unsigned long *alloc_thread_stack_node(struct task_struct *tsk,
309-
int node)
307+
static int alloc_thread_stack_node(struct task_struct *tsk, int node)
310308
{
311309
unsigned long *stack;
312310
stack = kmem_cache_alloc_node(thread_stack_cache, THREADINFO_GFP, node);
313311
stack = kasan_reset_tag(stack);
314312
tsk->stack = stack;
315-
return stack;
313+
return stack ? 0 : -ENOMEM;
316314
}
317315

318316
static void free_thread_stack(struct task_struct *tsk)
@@ -332,13 +330,13 @@ void thread_stack_cache_init(void)
332330
# endif /* THREAD_SIZE >= PAGE_SIZE || defined(CONFIG_VMAP_STACK) */
333331
#else /* CONFIG_ARCH_THREAD_STACK_ALLOCATOR */
334332

335-
static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)
333+
static int alloc_thread_stack_node(struct task_struct *tsk, int node)
336334
{
337335
unsigned long *stack;
338336

339337
stack = arch_alloc_thread_stack_node(tsk, node);
340338
tsk->stack = stack;
341-
return stack;
339+
return stack ? 0 : -ENOMEM;
342340
}
343341

344342
static void free_thread_stack(struct task_struct *tsk)
@@ -895,8 +893,6 @@ void set_task_stack_end_magic(struct task_struct *tsk)
895893
static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
896894
{
897895
struct task_struct *tsk;
898-
unsigned long *stack;
899-
struct vm_struct *stack_vm_area __maybe_unused;
900896
int err;
901897

902898
if (node == NUMA_NO_NODE)
@@ -909,24 +905,13 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
909905
if (err)
910906
goto free_tsk;
911907

912-
stack = alloc_thread_stack_node(tsk, node);
913-
if (!stack)
908+
err = alloc_thread_stack_node(tsk, node);
909+
if (err)
914910
goto free_tsk;
915911

916912
if (memcg_charge_kernel_stack(tsk))
917913
goto free_stack;
918914

919-
stack_vm_area = task_stack_vm_area(tsk);
920-
921-
/*
922-
* arch_dup_task_struct() clobbers the stack-related fields. Make
923-
* sure they're properly initialized before using any stack-related
924-
* functions again.
925-
*/
926-
tsk->stack = stack;
927-
#ifdef CONFIG_VMAP_STACK
928-
tsk->stack_vm_area = stack_vm_area;
929-
#endif
930915
#ifdef CONFIG_THREAD_INFO_IN_TASK
931916
refcount_set(&tsk->stack_refcount, 1);
932917
#endif

0 commit comments

Comments
 (0)