提交 5b3eec0c 编写于 作者: I Ingo Molnar

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: NCyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
Tested-by: NCyrill Gorcunov <gorcunov@gmail.com>
上级 3bdae4f4
...@@ -361,34 +361,35 @@ ENTRY(save_paranoid) ...@@ -361,34 +361,35 @@ ENTRY(save_paranoid)
END(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) ENTRY(ret_from_fork)
DEFAULT_FRAME DEFAULT_FRAME
push kernel_eflags(%rip) push kernel_eflags(%rip)
CFI_ADJUST_CFA_OFFSET 8 CFI_ADJUST_CFA_OFFSET 8
popf # reset kernel eflags popf # reset kernel eflags
CFI_ADJUST_CFA_OFFSET -8 CFI_ADJUST_CFA_OFFSET -8
call schedule_tail
call schedule_tail # rdi: 'prev' task parameter
GET_THREAD_INFO(%rcx) GET_THREAD_INFO(%rcx)
testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%rcx)
CFI_REMEMBER_STATE CFI_REMEMBER_STATE
jnz rff_trace
rff_action:
RESTORE_REST RESTORE_REST
testl $3,CS-ARGOFFSET(%rsp) # from kernel_thread?
testl $3, CS-ARGOFFSET(%rsp) # from kernel_thread?
je int_ret_from_sys_call 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 jnz int_ret_from_sys_call
RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET
jmp ret_from_sys_call jmp ret_from_sys_call # go to the SYSRET fastpath
CFI_RESTORE_STATE CFI_RESTORE_STATE
rff_trace:
movq %rsp,%rdi
call syscall_trace_leave
GET_THREAD_INFO(%rcx)
jmp rff_action
CFI_ENDPROC CFI_ENDPROC
END(ret_from_fork) END(ret_from_fork)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册