mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 05:34:13 +08:00
fork: Duplicate task_struct before stack allocation
alloc_thread_stack_node() already populates the task_struct::stack member except on IA64. The stack pointer is saved and populated again because IA64 needs it and arch_dup_task_struct() overwrites it. Allocate thread's stack after task_struct has been duplicated as a preparation for further changes. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lore.kernel.org/r/20220217102406.3697941-3-bigeasy@linutronix.de
This commit is contained in:
parent
be9a2277ca
commit
546c42b2c5
@ -888,6 +888,10 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
|
||||
if (!tsk)
|
||||
return NULL;
|
||||
|
||||
err = arch_dup_task_struct(tsk, orig);
|
||||
if (err)
|
||||
goto free_tsk;
|
||||
|
||||
stack = alloc_thread_stack_node(tsk, node);
|
||||
if (!stack)
|
||||
goto free_tsk;
|
||||
@ -897,8 +901,6 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
|
||||
|
||||
stack_vm_area = task_stack_vm_area(tsk);
|
||||
|
||||
err = arch_dup_task_struct(tsk, orig);
|
||||
|
||||
/*
|
||||
* arch_dup_task_struct() clobbers the stack-related fields. Make
|
||||
* sure they're properly initialized before using any stack-related
|
||||
@ -912,9 +914,6 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
|
||||
refcount_set(&tsk->stack_refcount, 1);
|
||||
#endif
|
||||
|
||||
if (err)
|
||||
goto free_stack;
|
||||
|
||||
err = scs_prepare(tsk, node);
|
||||
if (err)
|
||||
goto free_stack;
|
||||
|
Loading…
Reference in New Issue
Block a user