powerpc: copy_thread don't set _TIF_RESTOREALL
authorNicholas Piggin <npiggin@gmail.com>
Sat, 25 Mar 2023 12:29:03 +0000 (22:29 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 11 Apr 2023 13:13:33 +0000 (23:13 +1000)
In the kernel user thread path, don't set _TIF_RESTOREALL because
the thread is required to call kernel_execve() before it returns,
which will set _TIF_RESTOREALL if necessary via start_thread().

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230325122904.2375060-8-npiggin@gmail.com
arch/powerpc/kernel/interrupt_64.S
arch/powerpc/kernel/process.c

index a44c8aa..2a05921 100644 (file)
@@ -748,6 +748,11 @@ _GLOBAL(ret_from_kernel_user_thread)
 #endif
        bctrl
        li      r3,0
+       /*
+        * It does not matter whether this returns via the scv or sc path
+        * because it returns as execve() and therefore has no calling ABI
+        * (i.e., it sets registers according to the exec()ed entry point).
+        */
        b       .Lsyscall_exit
 
 _GLOBAL(start_kernel_thread)
index 14fe470..2d90f39 100644 (file)
@@ -1745,7 +1745,6 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
        extern void start_kernel_thread(void);
        void (*f)(void);
        unsigned long sp = (unsigned long)task_stack_page(p) + THREAD_SIZE;
-       struct thread_info *ti = task_thread_info(p);
 #ifdef CONFIG_HAVE_HW_BREAKPOINT
        int i;
 #endif
@@ -1784,7 +1783,6 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 #ifdef CONFIG_PPC64
                        childregs->softe = IRQS_ENABLED;
 #endif
-                       ti->flags |= _TIF_RESTOREALL;
                        f = ret_from_kernel_user_thread;
                } else {
                        struct pt_regs *regs = current_pt_regs();