• Josh Poimboeuf's avatar
    ftrace/x86: Implement HAVE_FUNCTION_GRAPH_RET_ADDR_PTR · 471bd10f
    Josh Poimboeuf authored
    Use the more reliable version of ftrace_graph_ret_addr() so we no longer
    have to worry about the unwinder getting out of sync with the function
    graph ret_stack index, which can happen if the unwinder skips any frames
    before calling ftrace_graph_ret_addr().
    
    This fixes this issue (and several others like it):
    
      $ cat /proc/self/stack
      [<ffffffff810489a2>] save_stack_trace_tsk+0x22/0x40
      [<ffffffff81311a89>] proc_pid_stack+0xb9/0x110
      [<ffffffff813127c4>] proc_single_show+0x54/0x80
      [<ffffffff812be088>] seq_read+0x108/0x3e0
      [<ffffffff812923d7>] __vfs_read+0x37/0x140
      [<ffffffff812929d9>] vfs_read+0x99/0x140
      [<ffffffff81293f28>] SyS_read+0x58/0xc0
      [<ffffffff818af97c>] entry_SYSCALL_64_fastpath+0x1f/0xbd
      [<ffffffffffffffff>] 0xffffffffffffffff
    
      $ echo function_graph > /sys/kernel/debug/tracing/current_tracer
    
      $ cat /proc/self/stack
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff810394cc>] print_context_stack+0xfc/0x100
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff8103891b>] dump_trace+0x12b/0x350
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff810489a2>] save_stack_trace_tsk+0x22/0x40
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff81311a89>] proc_pid_stack+0xb9/0x110
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff813127c4>] proc_single_show+0x54/0x80
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff812be088>] seq_read+0x108/0x3e0
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff812923d7>] __vfs_read+0x37/0x140
      [<ffffffff818b2428>] return_to_handler+0x0/0x27
      [<ffffffff812929d9>] vfs_read+0x99/0x140
      [<ffffffffffffffff>] 0xffffffffffffffff
    
    Enabling function graph tracing causes the stack trace to change in two
    ways:
    
    First, the real call addresses are confusingly interspersed with
    'return_to_handler' addresses.  This issue will be fixed by the next
    patch.
    
    Second, the stack trace is offset by two frames, because the unwinder
    skipped the first two frames and got out of sync with the ret_stack
    index.  This patch fixes this issue.
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Byungchul Park <byungchul.park@lge.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Nilay Vaish <nilayvaish@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/a6d623e36f8d08f9a17bd74d804d201177a23afd.1471607358.git.jpoimboe@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    471bd10f
ftrace.c 24.1 KB