Allow process builders that call copy_process() directly to attach and wait for the existing vfork completion without duplicating its signal and task-reference handling.
Assisted-by: Codex:gpt-5.6-sol Signed-off-by: Li Chen <[email protected]> --- include/linux/sched/task.h | 3 +++ kernel/fork.c | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h index e0c1ca8c6a188..92b4e3bc31e66 100644 --- a/include/linux/sched/task.h +++ b/include/linux/sched/task.h @@ -14,6 +14,7 @@ struct task_struct; struct rusage; +struct completion; union thread_union; struct css_set; @@ -99,6 +100,8 @@ extern void exit_itimers(struct task_struct *); extern pid_t kernel_clone(struct kernel_clone_args *kargs); struct task_struct *copy_process(struct pid *pid, int trace, int node, struct kernel_clone_args *args); +int wait_for_vfork_done(struct task_struct *child, + struct completion *vfork); struct task_struct *create_io_thread(int (*fn)(void *), void *arg, int node); struct task_struct *fork_idle(int); extern pid_t kernel_thread(int (*fn)(void *), void *arg, const char *name, diff --git a/kernel/fork.c b/kernel/fork.c index f3f378a85be4c..970810a01bbf6 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1435,8 +1435,7 @@ static void complete_vfork_done(struct task_struct *tsk) task_unlock(tsk); } -static int wait_for_vfork_done(struct task_struct *child, - struct completion *vfork) +int wait_for_vfork_done(struct task_struct *child, struct completion *vfork) { unsigned int state = TASK_KILLABLE|TASK_FREEZABLE; int killed; -- 2.52.0

