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

Commit 5b3eec0c authored by Ingo Molnar's avatar Ingo Molnar
Browse files

x86: ret_from_fork - get rid of jump back



Impact: remove dead code

If we take a closer look at the rff_trace/rff_action ret_from_fork code,
we have to realize that it does all the wrong things: for example it
checks the TIF flag - while later on jumping back to the ret-from-syscall
path - duplicating the check needlessly.

But checking for _TIF_SYSCALL_TRACE is completely unnecessary here because
we clear that flag for every freshly forked task. So the whole "tracing"
code here, for which there is a out of line jump optimization that makes
it even harder to read, is in reality completely dead code ...

Reported-by: default avatarCyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Tested-by: default avatarCyrill Gorcunov <gorcunov@gmail.com>
parent 3bdae4f4
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -361,34 +361,35 @@ ENTRY(save_paranoid)
END(save_paranoid)

/*
 * A newly forked process directly context switches into this.
 * A newly forked process directly context switches into this address.
 *
 * rdi: prev task we switched from
 */
/* rdi:	prev */
ENTRY(ret_from_fork)
	DEFAULT_FRAME

	push kernel_eflags(%rip)
	CFI_ADJUST_CFA_OFFSET 8
	popf					# reset kernel eflags
	CFI_ADJUST_CFA_OFFSET -8
	call schedule_tail

	call schedule_tail			# rdi: 'prev' task parameter

	GET_THREAD_INFO(%rcx)
	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%rcx)

	CFI_REMEMBER_STATE
	jnz rff_trace
rff_action:
	RESTORE_REST

	testl $3, CS-ARGOFFSET(%rsp)		# from kernel_thread?
	je   int_ret_from_sys_call
	testl $_TIF_IA32,TI_flags(%rcx)

	testl $_TIF_IA32, TI_flags(%rcx)	# 32-bit compat task needs IRET
	jnz  int_ret_from_sys_call

	RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET
	jmp ret_from_sys_call
	jmp ret_from_sys_call			# go to the SYSRET fastpath

	CFI_RESTORE_STATE
rff_trace:
	movq %rsp,%rdi
	call syscall_trace_leave
	GET_THREAD_INFO(%rcx)
	jmp rff_action
	CFI_ENDPROC
END(ret_from_fork)