fork: introduce kernel_clone()
The old _do_fork() helper doesn't follow naming conventions of in-kernel
helpers for syscalls. The process creation cleanup in [1] didn't change the
name to something more reasonable mainly because _do_fork() was used in quite a
few places. So sending this as a separate series seemed the better strategy.
This commit does two things:
1. renames _do_fork() to kernel_clone() but keeps _do_fork() as a simple static
inline wrapper around kernel_clone().
2. Changes the return type from long to pid_t. This aligns kernel_thread() and
kernel_clone(). Also, the return value from kernel_clone that is surfaced in
fork(), vfork(), clone(), and clone3() is taken from pid_vrn() which returns
a pid_t too.
Follow-up patches will switch each caller of _do_fork() and each place where it
is referenced over to kernel_clone(). After all these changes are done, we can
remove _do_fork() completely and will only be left with kernel_clone().
[1]: 9ba27414f2
("Merge tag 'fork-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux")
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
Link: https://lore.kernel.org/r/20200819104655.436656-2-christian.brauner@ubuntu.com
This commit is contained in:
parent
9123e3a74e
commit
cad6967ac1
|
@ -83,7 +83,11 @@ extern void do_group_exit(int);
|
||||||
extern void exit_files(struct task_struct *);
|
extern void exit_files(struct task_struct *);
|
||||||
extern void exit_itimers(struct signal_struct *);
|
extern void exit_itimers(struct signal_struct *);
|
||||||
|
|
||||||
extern long _do_fork(struct kernel_clone_args *kargs);
|
extern pid_t kernel_clone(struct kernel_clone_args *kargs);
|
||||||
|
static inline long _do_fork(struct kernel_clone_args *kargs)
|
||||||
|
{
|
||||||
|
return kernel_clone(kargs);
|
||||||
|
}
|
||||||
struct task_struct *fork_idle(int);
|
struct task_struct *fork_idle(int);
|
||||||
struct mm_struct *copy_init_mm(void);
|
struct mm_struct *copy_init_mm(void);
|
||||||
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
|
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
|
||||||
|
|
|
@ -2384,14 +2384,14 @@ struct mm_struct *copy_init_mm(void)
|
||||||
*
|
*
|
||||||
* args->exit_signal is expected to be checked for sanity by the caller.
|
* args->exit_signal is expected to be checked for sanity by the caller.
|
||||||
*/
|
*/
|
||||||
long _do_fork(struct kernel_clone_args *args)
|
pid_t kernel_clone(struct kernel_clone_args *args)
|
||||||
{
|
{
|
||||||
u64 clone_flags = args->flags;
|
u64 clone_flags = args->flags;
|
||||||
struct completion vfork;
|
struct completion vfork;
|
||||||
struct pid *pid;
|
struct pid *pid;
|
||||||
struct task_struct *p;
|
struct task_struct *p;
|
||||||
int trace = 0;
|
int trace = 0;
|
||||||
long nr;
|
pid_t nr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For legacy clone() calls, CLONE_PIDFD uses the parent_tid argument
|
* For legacy clone() calls, CLONE_PIDFD uses the parent_tid argument
|
||||||
|
@ -2477,7 +2477,7 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)
|
||||||
.stack_size = (unsigned long)arg,
|
.stack_size = (unsigned long)arg,
|
||||||
};
|
};
|
||||||
|
|
||||||
return _do_fork(&args);
|
return kernel_clone(&args);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __ARCH_WANT_SYS_FORK
|
#ifdef __ARCH_WANT_SYS_FORK
|
||||||
|
@ -2488,7 +2488,7 @@ SYSCALL_DEFINE0(fork)
|
||||||
.exit_signal = SIGCHLD,
|
.exit_signal = SIGCHLD,
|
||||||
};
|
};
|
||||||
|
|
||||||
return _do_fork(&args);
|
return kernel_clone(&args);
|
||||||
#else
|
#else
|
||||||
/* can not support in nommu mode */
|
/* can not support in nommu mode */
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -2504,7 +2504,7 @@ SYSCALL_DEFINE0(vfork)
|
||||||
.exit_signal = SIGCHLD,
|
.exit_signal = SIGCHLD,
|
||||||
};
|
};
|
||||||
|
|
||||||
return _do_fork(&args);
|
return kernel_clone(&args);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2542,7 +2542,7 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
|
||||||
.tls = tls,
|
.tls = tls,
|
||||||
};
|
};
|
||||||
|
|
||||||
return _do_fork(&args);
|
return kernel_clone(&args);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2700,7 +2700,7 @@ SYSCALL_DEFINE2(clone3, struct clone_args __user *, uargs, size_t, size)
|
||||||
if (!clone3_args_valid(&kargs))
|
if (!clone3_args_valid(&kargs))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return _do_fork(&kargs);
|
return kernel_clone(&kargs);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2863,7 +2863,7 @@ int unshare_fd(unsigned long unshare_flags, unsigned int max_fds,
|
||||||
/*
|
/*
|
||||||
* unshare allows a process to 'unshare' part of the process
|
* unshare allows a process to 'unshare' part of the process
|
||||||
* context which was originally shared using clone. copy_*
|
* context which was originally shared using clone. copy_*
|
||||||
* functions used by _do_fork() cannot be used here directly
|
* functions used by kernel_clone() cannot be used here directly
|
||||||
* because they modify an inactive task_struct that is being
|
* because they modify an inactive task_struct that is being
|
||||||
* constructed. Here we are modifying the current, active,
|
* constructed. Here we are modifying the current, active,
|
||||||
* task_struct.
|
* task_struct.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user