Skip to content

Commit 37fe5d4

Browse files
author
Al Viro
committed
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>
1 parent 65f22a9 commit 37fe5d4

File tree

3 files changed

+28
-16
lines changed

3 files changed

+28
-16
lines changed

arch/s390/kernel/entry.S

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -331,14 +331,26 @@ ENTRY(ret_from_fork)
331331
l %r12,__LC_THREAD_INFO
332332
l %r13,__LC_SVC_NEW_PSW+4
333333
tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ?
334-
jo 0f
335-
st %r15,__PT_R15(%r11) # store stack pointer for new kthread
336-
0: l %r1,BASED(.Lschedule_tail)
334+
je 1f
335+
l %r1,BASED(.Lschedule_tail)
337336
basr %r14,%r1 # call schedule_tail
338337
TRACE_IRQS_ON
339338
ssm __LC_SVC_NEW_PSW # reenable interrupts
340339
j sysc_tracenogo
341340

341+
1: # it's a kernel thread
342+
st %r15,__PT_R15(%r11) # store stack pointer for new kthread
343+
l %r1,BASED(.Lschedule_tail)
344+
basr %r14,%r1 # call schedule_tail
345+
TRACE_IRQS_ON
346+
ssm __LC_SVC_NEW_PSW # reenable interrupts
347+
lm %r9,%r11,__PT_R9(%r11) # load gprs
348+
ENTRY(kernel_thread_starter)
349+
la %r2,0(%r10)
350+
basr %r14,%r9
351+
la %r2,0
352+
br %r11 # do_exit
353+
342354
#
343355
# kernel_execve function needs to deal with pt_regs that is not
344356
# at the usual place

arch/s390/kernel/entry64.S

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,12 +352,22 @@ ENTRY(ret_from_fork)
352352
la %r11,STACK_FRAME_OVERHEAD(%r15)
353353
lg %r12,__LC_THREAD_INFO
354354
tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ?
355-
jo 0f
356-
stg %r15,__PT_R15(%r11) # store stack pointer for new kthread
357-
0: brasl %r14,schedule_tail
355+
je 1f
356+
brasl %r14,schedule_tail
358357
TRACE_IRQS_ON
359358
ssm __LC_SVC_NEW_PSW # reenable interrupts
360359
j sysc_tracenogo
360+
1: # it's a kernel thread
361+
stg %r15,__PT_R15(%r11) # store stack pointer for new kthread
362+
brasl %r14,schedule_tail
363+
TRACE_IRQS_ON
364+
ssm __LC_SVC_NEW_PSW # reenable interrupts
365+
lmg %r9,%r11,__PT_R9(%r11) # load gprs
366+
ENTRY(kernel_thread_starter)
367+
la %r2,0(%r10)
368+
basr %r14,%r9
369+
la %r2,0
370+
br %r11 # do_exit
361371

362372
#
363373
# kernel_execve function needs to deal with pt_regs that is not

arch/s390/kernel/process.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,16 +98,6 @@ void cpu_idle(void)
9898

9999
extern void __kprobes kernel_thread_starter(void);
100100

101-
asm(
102-
".section .kprobes.text, \"ax\"\n"
103-
".global kernel_thread_starter\n"
104-
"kernel_thread_starter:\n"
105-
" la 2,0(10)\n"
106-
" basr 14,9\n"
107-
" la 2,0\n"
108-
" br 11\n"
109-
".previous\n");
110-
111101
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
112102
{
113103
struct pt_regs regs;

0 commit comments

Comments
 (0)