Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37fe5d41 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 65f22a90
Loading
Loading
Loading
Loading
+15 −3
Original line number Original line Diff line number Diff line
@@ -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
+13 −3
Original line number Original line Diff line number Diff line
@@ -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
+0 −10
Original line number Original line Diff line number Diff line
@@ -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;