]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
x86: ret_from_fork - get rid of jump back
authorIngo Molnar <mingo@elte.hu>
Thu, 27 Nov 2008 13:41:21 +0000 (14:41 +0100)
committerIngo Molnar <mingo@elte.hu>
Fri, 28 Nov 2008 14:01:46 +0000 (15:01 +0100)
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: Cyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Tested-by: Cyrill Gorcunov <gorcunov@gmail.com>
arch/x86/kernel/entry_64.S

index e41734a537bd9f21f33116abd332423e15d01955..3194636a4293343a4ca0dd2ab90b81b196577256 100644 (file)
@@ -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
+       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?
+
+       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)