s390: fold kernel_thread_helper() into ret_from_fork()
... and don't bother with syscall return path in case of kernel threads. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
65f22a906e
commit
37fe5d41f6
@ -331,14 +331,26 @@ ENTRY(ret_from_fork)
|
|||||||
l %r12,__LC_THREAD_INFO
|
l %r12,__LC_THREAD_INFO
|
||||||
l %r13,__LC_SVC_NEW_PSW+4
|
l %r13,__LC_SVC_NEW_PSW+4
|
||||||
tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ?
|
tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ?
|
||||||
jo 0f
|
je 1f
|
||||||
st %r15,__PT_R15(%r11) # store stack pointer for new kthread
|
l %r1,BASED(.Lschedule_tail)
|
||||||
0: l %r1,BASED(.Lschedule_tail)
|
|
||||||
basr %r14,%r1 # call schedule_tail
|
basr %r14,%r1 # call schedule_tail
|
||||||
TRACE_IRQS_ON
|
TRACE_IRQS_ON
|
||||||
ssm __LC_SVC_NEW_PSW # reenable interrupts
|
ssm __LC_SVC_NEW_PSW # reenable interrupts
|
||||||
j sysc_tracenogo
|
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
|
# kernel_execve function needs to deal with pt_regs that is not
|
||||||
# at the usual place
|
# at the usual place
|
||||||
|
@ -352,12 +352,22 @@ ENTRY(ret_from_fork)
|
|||||||
la %r11,STACK_FRAME_OVERHEAD(%r15)
|
la %r11,STACK_FRAME_OVERHEAD(%r15)
|
||||||
lg %r12,__LC_THREAD_INFO
|
lg %r12,__LC_THREAD_INFO
|
||||||
tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ?
|
tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ?
|
||||||
jo 0f
|
je 1f
|
||||||
stg %r15,__PT_R15(%r11) # store stack pointer for new kthread
|
brasl %r14,schedule_tail
|
||||||
0: brasl %r14,schedule_tail
|
|
||||||
TRACE_IRQS_ON
|
TRACE_IRQS_ON
|
||||||
ssm __LC_SVC_NEW_PSW # reenable interrupts
|
ssm __LC_SVC_NEW_PSW # reenable interrupts
|
||||||
j sysc_tracenogo
|
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
|
# kernel_execve function needs to deal with pt_regs that is not
|
||||||
|
@ -98,16 +98,6 @@ void cpu_idle(void)
|
|||||||
|
|
||||||
extern void __kprobes kernel_thread_starter(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)
|
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
|
||||||
{
|
{
|
||||||
struct pt_regs regs;
|
struct pt_regs regs;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user