• Adrian Hunter's avatar
    perf thread-stack: Fix thread stack return from kernel for kernel-only case · 13449616
    Adrian Hunter authored
    commit 97860b48 upstream.
    
    Commit f08046cb ("perf thread-stack: Represent jmps to the start of a
    different symbol") had the side-effect of introducing more stack entries
    before return from kernel space.
    
    When user space is also traced, those entries are popped before entry to
    user space, but when user space is not traced, they get stuck at the
    bottom of the stack, making the stack grow progressively larger.
    
    Fix by detecting a return-from-kernel branch type, and popping kernel
    addresses from the stack then.
    
    Note, the problem and fix affect the exported Call Graph / Tree but not
    the callindent option used by "perf script --call-trace".
    
    Example:
    
      perf-with-kcore record example -e intel_pt//k -- ls
      perf-with-kcore script example --itrace=bep -s ~/libexec/perf-core/scripts/python/export-to-sqlite.py example.db branches calls
      ~/libexec/perf-core/scripts/python/exported-sql-viewer.py example.db
    
      Menu option: Reports -> Context-Sensitive Call Graph
    
      Before: (showing Call Path column only)
    
        Call Path
         perf
        ▼ ls
          ▼ 12111:12111
             setup_new_exec
             __task_pid_nr_ns
             perf_event_pid_type
             perf_event_comm_output
             perf_iterate_ctx
             perf_iterate_sb
             perf_event_comm
             __set_task_comm
             load_elf_binary
             search_binary_handler
             __do_execve_file.isra.41
             __x64_sys_execve
             do_syscall_64
            ▼ entry_SYSCALL_64_after_hwframe
              ▼ swapgs_restore_regs_and_return_to_usermode
                ▼ native_iret
                   error_entry
                   do_page_fault
                  ▼ error_exit
                    ▼ retint_user
                       prepare_exit_to_usermode
                      ▼ native_iret
                         error_entry
                         do_page_fault
                        ▼ error_exit
                          ▼ retint_user
                             prepare_exit_to_usermode
                            ▼ native_iret
                               error_entry
                               do_page_fault
                              ▼ error_exit
                                ▼ retint_user
                                   prepare_exit_to_usermode
                                   native_iret
    
      After: (showing Call Path column only)
    
        Call Path
         perf
        ▼ ls
          ▼ 12111:12111
             setup_new_exec
             __task_pid_nr_ns
             perf_event_pid_type
             perf_event_comm_output
             perf_iterate_ctx
             perf_iterate_sb
             perf_event_comm
             __set_task_comm
             load_elf_binary
             search_binary_handler
             __do_execve_file.isra.41
             __x64_sys_execve
             do_syscall_64
             entry_SYSCALL_64_after_hwframe
             page_fault
            ▼ entry_SYSCALL_64
              ▼ do_syscall_64
                 __x64_sys_brk
                 __x64_sys_access
                 __x64_sys_openat
                 __x64_sys_newfstat
                 __x64_sys_mmap
                 __x64_sys_close
                 __x64_sys_read
                 __x64_sys_mprotect
                 __x64_sys_arch_prctl
                 __x64_sys_munmap
                 exit_to_usermode_loop
                 __x64_sys_set_tid_address
                 __x64_sys_set_robust_list
                 __x64_sys_rt_sigaction
                 __x64_sys_rt_sigprocmask
                 __x64_sys_prlimit64
                 __x64_sys_statfs
                 __x64_sys_ioctl
                 __x64_sys_getdents64
                 __x64_sys_write
                 __x64_sys_exit_group
    
    Committer notes:
    
    The first arg to the perf-with-kcore needs to be the same for the
    'record' and 'script' lines, otherwise we'll record the perf.data file
    and kcore_dir/ files in one directory ('example') to then try to use it
    from the 'bep' directory, fix the instructions above it so that both use
    'example'.
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: stable@vger.kernel.org
    Fixes: f08046cb ("perf thread-stack: Represent jmps to the start of a different symbol")
    Link: http://lkml.kernel.org/r/20190619064429.14940-2-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    13449616
thread-stack.c 23.5 KB