]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
fork: Pass struct kernel_clone_args into copy_thread
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 8 Apr 2022 23:07:50 +0000 (18:07 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Sat, 7 May 2022 14:01:48 +0000 (09:01 -0500)
With io_uring we have started supporting tasks that are for most
purposes user space tasks that exclusively run code in kernel mode.

The kernel task that exec's init and tasks that exec user mode
helpers are also user mode tasks that just run kernel code
until they call kernel execve.

Pass kernel_clone_args into copy_thread so these oddball
tasks can be supported more cleanly and easily.

v2: Fix spelling of kenrel_clone_args on h8300
Link: https://lkml.kernel.org/r/20220506141512.516114-2-ebiederm@xmission.com
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
25 files changed:
arch/alpha/kernel/process.c
arch/arc/kernel/process.c
arch/arm/kernel/process.c
arch/arm64/kernel/process.c
arch/csky/kernel/process.c
arch/h8300/kernel/process.c
arch/hexagon/kernel/process.c
arch/ia64/kernel/process.c
arch/m68k/kernel/process.c
arch/microblaze/kernel/process.c
arch/mips/kernel/process.c
arch/nios2/kernel/process.c
arch/openrisc/kernel/process.c
arch/parisc/kernel/process.c
arch/powerpc/kernel/process.c
arch/riscv/kernel/process.c
arch/s390/kernel/process.c
arch/sh/kernel/process_32.c
arch/sparc/kernel/process_32.c
arch/sparc/kernel/process_64.c
arch/um/kernel/process.c
arch/x86/kernel/process.c
arch/xtensa/kernel/process.c
include/linux/sched/task.h
kernel/fork.c

index 5f8527081da92fc69d12b77be04f706475c21239..732e39217c7f3c60d9c0f8c2f34af0cbec40cde0 100644 (file)
@@ -233,10 +233,12 @@ release_thread(struct task_struct *dead_task)
 /*
  * Copy architecture-specific thread state
  */
-int copy_thread(unsigned long clone_flags, unsigned long usp,
-               unsigned long kthread_arg, struct task_struct *p,
-               unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long kthread_arg = args->stack_size;
+       unsigned long tls = args->tls;
        extern void ret_from_fork(void);
        extern void ret_from_kernel_thread(void);
 
index 5f7f5aab361f17f9db0ae01baf594f6ceeb12868..caf948ba647ccc23e2197e30f341ac2c0935ab22 100644 (file)
@@ -162,10 +162,12 @@ asmlinkage void ret_from_fork(void);
  * |    user_r25    |
  * ------------------  <===== END of PAGE
  */
-int copy_thread(unsigned long clone_flags, unsigned long usp,
-               unsigned long kthread_arg, struct task_struct *p,
-               unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long kthread_arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *c_regs;        /* child's pt_regs */
        unsigned long *childksp;       /* to unwind out of __switch_to() */
        struct callee_regs *c_callee;  /* child's callee regs */
index 0617af11377f09c5b1446fcc538f35f7044f0afa..8e13b426dd264cfcf94284861e768972be85a0aa 100644 (file)
@@ -238,9 +238,12 @@ void release_thread(struct task_struct *dead_task)
 
 asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
 
-int copy_thread(unsigned long clone_flags, unsigned long stack_start,
-               unsigned long stk_sz, struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long stack_start = args->stack;
+       unsigned long stk_sz = args->stack_size;
+       unsigned long tls = args->tls;
        struct thread_info *thread = task_thread_info(p);
        struct pt_regs *childregs = task_pt_regs(p);
 
index 7fa97df55e3ad3f24443cf6ec49318d1e64f8e53..e002f6681c8dcec24ac39902990c84379e531df2 100644 (file)
@@ -316,9 +316,12 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
 
 asmlinkage void ret_from_fork(void) asm("ret_from_fork");
 
-int copy_thread(unsigned long clone_flags, unsigned long stack_start,
-               unsigned long stk_sz, struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long stack_start = args->stack;
+       unsigned long stk_sz = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *childregs = task_pt_regs(p);
 
        memset(&p->thread.cpu_context, 0, sizeof(struct cpu_context));
index 3d0ca22cd0e2e6075c4bcdcb5d69d6e55f5131f1..7dba33d37e1a7227cf84808425090b8687738ebb 100644 (file)
@@ -30,12 +30,12 @@ asmlinkage void ret_from_kernel_thread(void);
  */
 void flush_thread(void){}
 
-int copy_thread(unsigned long clone_flags,
-               unsigned long usp,
-               unsigned long kthread_arg,
-               struct task_struct *p,
-               unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long kthread_arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct switch_stack *childstack;
        struct pt_regs *childregs = task_pt_regs(p);
 
index 8833fa4f5d51640126a5e0c36a00b0164222ceae..752cbd9b0bf62264cae66128dd3775f493c431f6 100644 (file)
@@ -105,9 +105,10 @@ void flush_thread(void)
 {
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long usp,
-               unsigned long topstk, struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long usp = args->stack;
+       unsigned long topstk = args->stack_size;
        struct pt_regs *childregs;
 
        childregs = (struct pt_regs *) (THREAD_SIZE + task_stack_page(p)) - 1;
index eab03c691f53f3197891f803dbfa0d5ae6a1612a..f1c1f6f21941dd67ec8d3027aec70eedf161e925 100644 (file)
@@ -50,9 +50,12 @@ void arch_cpu_idle(void)
 /*
  * Copy architecture-specific thread state
  */
-int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct thread_info *ti = task_thread_info(p);
        struct hexagon_switch_stack *ss;
        struct pt_regs *childregs;
index d7a256bd9d6b76e555fd53a7bfcb0e06c7b3fea4..10d41ded05a5cb684e33d013d3e5bef7fada6af9 100644 (file)
@@ -295,9 +295,12 @@ ia64_load_extra (struct task_struct *task)
  * so there is nothing to worry about.
  */
 int
-copy_thread(unsigned long clone_flags, unsigned long user_stack_base,
-           unsigned long user_stack_size, struct task_struct *p, unsigned long tls)
+copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long user_stack_base = args->stack;
+       unsigned long user_stack_size = args->stack_size;
+       unsigned long tls = args->tls;
        extern char ia64_ret_from_clone;
        struct switch_stack *child_stack, *stack;
        unsigned long rbs, child_rbs, rbs_size;
index a6030dbaa0891675735c418ac8041ddaf455a543..8ac575656fc4df69c32eb5a57c3e4d42c2954aa3 100644 (file)
@@ -138,9 +138,12 @@ asmlinkage int m68k_clone3(struct pt_regs *regs)
        return sys_clone3((struct clone_args __user *)regs->d1, regs->d2);
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct fork_frame {
                struct switch_stack sw;
                struct pt_regs regs;
index 1b944d319d73dff618d8b438cf4b43131f54f3b8..b5f549125c6a2da01b87c889ea4afb79ce3477db 100644 (file)
@@ -52,9 +52,12 @@ void flush_thread(void)
 {
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *childregs = task_pt_regs(p);
        struct thread_info *ti = task_thread_info(p);
 
index c2d5f4bfe1f38206c1388220e554a05c99d06d8c..a572d097b16b30614cf34d17e498865e032562fa 100644 (file)
@@ -105,10 +105,12 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
 /*
  * Copy architecture-specific thread state
  */
-int copy_thread(unsigned long clone_flags, unsigned long usp,
-               unsigned long kthread_arg, struct task_struct *p,
-               unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long kthread_arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct thread_info *ti = task_thread_info(p);
        struct pt_regs *childregs, *regs = current_pt_regs();
        unsigned long childksp;
index f8ea522a15880c4018588b01b6b4bcd6fa550a5f..98c4bfe972e03604c7b8500c01a0de4e9e6dc301 100644 (file)
@@ -100,9 +100,12 @@ void flush_thread(void)
 {
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *childregs = task_pt_regs(p);
        struct pt_regs *regs;
        struct switch_stack *stack;
index 3c0c91bcdcbaa135feaf0c3e2cb23344425852cd..486e46dd58833e138a22bc587d329bfe0596b39f 100644 (file)
@@ -152,9 +152,12 @@ extern asmlinkage void ret_from_fork(void);
  */
 
 int
-copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-           struct task_struct *p, unsigned long tls)
+copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *userregs;
        struct pt_regs *kregs;
        unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE;
index 28b6a2a5574c614d20af12cae29eedb05c6664c6..129c17de45ba5b8dc7716c4ad6e841b539c62651 100644 (file)
@@ -206,9 +206,12 @@ arch_initcall(parisc_idle_init);
  * Copy architecture-specific thread state
  */
 int
-copy_thread(unsigned long clone_flags, unsigned long usp,
-           unsigned long kthread_arg, struct task_struct *p, unsigned long tls)
+copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long kthread_arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *cregs = &(p->thread.regs);
        void *stack = task_stack_page(p);
        
index 984813a4d5dc47283687e0cc7f38f7e5deaf19c9..3fd67c861d5482e17dd571ef550383eb549164b5 100644 (file)
@@ -1716,10 +1716,12 @@ static void setup_ksp_vsid(struct task_struct *p, unsigned long sp)
 /*
  * Copy architecture-specific thread state
  */
-int copy_thread(unsigned long clone_flags, unsigned long usp,
-               unsigned long kthread_arg, struct task_struct *p,
-               unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long kthread_arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *childregs, *kregs;
        extern void ret_from_fork(void);
        extern void ret_from_fork_scv(void);
index 504b496787aa4d384e5bae04dc35bf5f104123d7..334382731725d03c4d74d67965211d80fff831fe 100644 (file)
@@ -120,9 +120,12 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
        return 0;
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *childregs = task_pt_regs(p);
 
        /* p->thread holds context to be restored by __switch_to() */
index 71d86f73b02c99259284bfded37b41bbcbe2aec7..bb5daec39516a3efab138beedff14df5f7b02c19 100644 (file)
@@ -94,9 +94,12 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
        return 0;
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long new_stackp,
-               unsigned long arg, struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long new_stackp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct fake_frame
        {
                struct stack_frame sf;
index ca01286a0610004da0ff95862b81e8818055dc3f..6023399b189291a971bae52a0d18e259dc7cb2a0 100644 (file)
@@ -92,9 +92,12 @@ void release_thread(struct task_struct *dead_task)
 asmlinkage void ret_from_fork(void);
 asmlinkage void ret_from_kernel_thread(void);
 
-int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct thread_info *ti = task_thread_info(p);
        struct pt_regs *childregs;
 
index 88c0c14aaff07fbfdaffa2720bb2b98da8a0c088..80e6775e18c00863a105a7126cddc1909a2e484d 100644 (file)
@@ -259,9 +259,12 @@ clone_stackframe(struct sparc_stackf __user *dst,
 extern void ret_from_fork(void);
 extern void ret_from_kernel_thread(void);
 
-int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long sp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct thread_info *ti = task_thread_info(p);
        struct pt_regs *childregs, *regs = current_pt_regs();
        char *new_stack;
index 9a2ceb080ac919c6971f71f774e9cc041adbf3bb..38c46ca826d9d10d80e2e6fa64d08b81d070ebae 100644 (file)
@@ -564,9 +564,12 @@ barf:
  * Parent -->  %o0 == childs  pid, %o1 == 0
  * Child  -->  %o0 == parents pid, %o1 == 1
  */
-int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long sp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct thread_info *t = task_thread_info(p);
        struct pt_regs *regs = current_pt_regs();
        struct sparc_stackf *parent_sf;
index 80504680be084f4a7caa7c66b294fc1d0447671c..fd2d2361484df0c053766f96215fdc729b117c98 100644 (file)
@@ -154,9 +154,12 @@ void fork_handler(void)
        userspace(&current->thread.regs.regs, current_thread_info()->aux_fp_regs);
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long sp,
-               unsigned long arg, struct task_struct * p, unsigned long tls)
+int copy_thread(struct task_struct * p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long sp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        void (*handler)(void);
        int kthread = current->flags & (PF_KTHREAD | PF_IO_WORKER);
        int ret = 0;
index b370767f5b191e1556b3665a3b8b5f032decf0e6..0fce52b10dc4eb37a79a69e6b7e0419ed5baf7a9 100644 (file)
@@ -130,9 +130,12 @@ static int set_new_tls(struct task_struct *p, unsigned long tls)
                return do_set_thread_area_64(p, ARCH_SET_FS, tls);
 }
 
-int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg,
-               struct task_struct *p, unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long sp = args->stack;
+       unsigned long arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct inactive_task_frame *frame;
        struct fork_frame *fork_frame;
        struct pt_regs *childregs;
index e8bfbca5f0014faa0910728aa39707d14fb201af..15ce25073142bd8d04522992388b197920e1dd05 100644 (file)
@@ -201,10 +201,12 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
  * involved.  Much simpler to just not copy those live frames across.
  */
 
-int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
-               unsigned long thread_fn_arg, struct task_struct *p,
-               unsigned long tls)
+int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 {
+       unsigned long clone_flags = args->flags;
+       unsigned long usp_thread_fn = args->stack;
+       unsigned long thread_fn_arg = args->stack_size;
+       unsigned long tls = args->tls;
        struct pt_regs *childregs = task_pt_regs(p);
 
 #if (XTENSA_HAVE_COPROCESSORS || XTENSA_HAVE_IO_PORTS)
index 4492266935dd73a684f9d2f55b240ac31dc4cdcc..fcdcba231aac98022c2393ab1f24007d7ed4106f 100644 (file)
@@ -68,8 +68,7 @@ extern void fork_init(void);
 
 extern void release_task(struct task_struct * p);
 
-extern int copy_thread(unsigned long, unsigned long, unsigned long,
-                      struct task_struct *, unsigned long);
+extern int copy_thread(struct task_struct *, const struct kernel_clone_args *);
 
 extern void flush_thread(void);
 
index 27c5203750b4dc5424ac1f38198f0833de2ec8ef..d39a248a8d8db1d25080bed11446659eca40d974 100644 (file)
@@ -1979,7 +1979,7 @@ static __latent_entropy struct task_struct *copy_process(
        struct task_struct *p;
        struct multiprocess_signals delayed;
        struct file *pidfile = NULL;
-       u64 clone_flags = args->flags;
+       const u64 clone_flags = args->flags;
        struct nsproxy *nsp = current->nsproxy;
 
        /*
@@ -2240,7 +2240,7 @@ static __latent_entropy struct task_struct *copy_process(
        retval = copy_io(clone_flags, p);
        if (retval)
                goto bad_fork_cleanup_namespaces;
-       retval = copy_thread(clone_flags, args->stack, args->stack_size, p, args->tls);
+       retval = copy_thread(p, args);
        if (retval)
                goto bad_fork_cleanup_io;