]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
s390: fold kernel_thread_helper() into ret_from_fork()
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 10 Sep 2012 22:03:41 +0000 (18:03 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 Oct 2012 03:03:03 +0000 (23:03 -0400)
... and don't bother with syscall return path in case of kernel
threads.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/s390/kernel/entry.S
arch/s390/kernel/entry64.S
arch/s390/kernel/process.c

index 6286985a103971adab9287e83df492f85f9f3c12..24de1cd3754be18ead732700cd5833ed23fa4c01 100644 (file)
@@ -331,14 +331,26 @@ ENTRY(ret_from_fork)
        l       %r12,__LC_THREAD_INFO
        l       %r13,__LC_SVC_NEW_PSW+4
        tm      __PT_PSW+1(%r11),0x01   # forking a kernel thread ?
-       jo      0f
-       st      %r15,__PT_R15(%r11)     # store stack pointer for new kthread
-0:     l       %r1,BASED(.Lschedule_tail)
+       je      1f
+       l       %r1,BASED(.Lschedule_tail)
        basr    %r14,%r1                # call schedule_tail
        TRACE_IRQS_ON
        ssm     __LC_SVC_NEW_PSW        # reenable interrupts
        j       sysc_tracenogo
 
+1:     # it's a kernel thread
+       st      %r15,__PT_R15(%r11)     # store stack pointer for new kthread
+       l       %r1,BASED(.Lschedule_tail)
+       basr    %r14,%r1                # call schedule_tail
+       TRACE_IRQS_ON
+       ssm     __LC_SVC_NEW_PSW        # reenable interrupts
+       lm      %r9,%r11,__PT_R9(%r11)  # load gprs
+ENTRY(kernel_thread_starter)
+       la      %r2,0(%r10)
+       basr    %r14,%r9
+       la      %r2,0
+       br      %r11                    # do_exit
+
 #
 # kernel_execve function needs to deal with pt_regs that is not
 # at the usual place
index 1f776f2edda57788d2e78fbe0ab6d8186ea36d83..39c84e65f74f584f8507baaadf4e98111b757024 100644 (file)
@@ -352,12 +352,22 @@ ENTRY(ret_from_fork)
        la      %r11,STACK_FRAME_OVERHEAD(%r15)
        lg      %r12,__LC_THREAD_INFO
        tm      __PT_PSW+1(%r11),0x01   # forking a kernel thread ?
-       jo      0f
-       stg     %r15,__PT_R15(%r11)     # store stack pointer for new kthread
-0:     brasl   %r14,schedule_tail
+       je      1f
+       brasl   %r14,schedule_tail
        TRACE_IRQS_ON
        ssm     __LC_SVC_NEW_PSW        # reenable interrupts
        j       sysc_tracenogo
+1:     # it's a kernel thread
+       stg     %r15,__PT_R15(%r11)     # store stack pointer for new kthread
+       brasl   %r14,schedule_tail
+       TRACE_IRQS_ON
+       ssm     __LC_SVC_NEW_PSW        # reenable interrupts
+       lmg     %r9,%r11,__PT_R9(%r11)  # load gprs
+ENTRY(kernel_thread_starter)
+       la      %r2,0(%r10)
+       basr    %r14,%r9
+       la      %r2,0
+       br      %r11                    # do_exit
 
 #
 # kernel_execve function needs to deal with pt_regs that is not
index e540251e1dd18fc3812cf16e267d9dc7a10895f0..2868a364ff94a828add70abc7ef2950d811c4e6c 100644 (file)
@@ -98,16 +98,6 @@ void cpu_idle(void)
 
 extern void __kprobes kernel_thread_starter(void);
 
-asm(
-       ".section .kprobes.text, \"ax\"\n"
-       ".global kernel_thread_starter\n"
-       "kernel_thread_starter:\n"
-       "    la    2,0(10)\n"
-       "    basr  14,9\n"
-       "    la    2,0\n"
-       "    br    11\n"
-       ".previous\n");
-
 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
        struct pt_regs regs;