• Namhyung Kim's avatar
    perf tools: Fix build-id matching on vmlinux · b837a8bd
    Namhyung Kim authored
    There's a problem on finding correct kernel symbols when perf report
    runs on a different kernel.  Although a part of the problem was solved
    by the prior commit 0a7e6d1b ("perf tools: Check recorded kernel
    version when finding vmlinux"), there's a remaining problem still.
    
    When perf records samples, it synthesizes the kernel map using
    machine__mmap_name() and ref_reloc_sym like "[kernel.kallsyms]_text".
    You can easily see it using 'perf report -D' command.
    
    After finishing record, it goes through the recorded events to find
    maps/dsos actually used.  And then record build-id info of them.
    
    During this process, it needs to load symbols in a dso and it'd call
    dso__load_vmlinux_path() since the default value of the symbol_conf.
    try_vmlinux_path is true.  However it changes dso->long_name to a real
    path of the vmlinux file (e.g. /lib/modules/3.16.4/build/vmlinux) if one
    is running on a custom kernel.
    
    It resulted in that perf report reads the build-id of the vmlinux, but
    cannot use it since it only knows about the [kernel.kallsyms] map.  It
    then falls back to possible vmlinux paths by using the recorded kernel
    version (in case of a recent version) or a running kernel silently.
    
    Even with the recent tools, this still has a possibility of breaking
    the result.  As the build directory is a symbolic link, if one built a
    new kernel in the same directory with different source/config, the old
    link to vmlinux will point the new file.  So it's absolutely needed to
    use build-id when finding a kernel image.
    
    In this patch, it's now changed to try to search a kernel dso in the
    existing dso list which was constructed during build-id table parsing
    so it'll always have a build-id.  If not found, search "[kernel.kallsyms]".
    
    Before:
    
      $ perf report
      # Children      Self  Command  Shared Object      Symbol
      # ........  ........  .......  .................  ...............................
      #
          72.15%     0.00%  swapper  [kernel.kallsyms]  [k] set_curr_task_rt
          72.15%     0.00%  swapper  [kernel.kallsyms]  [k] native_calibrate_tsc
          72.15%     0.00%  swapper  [kernel.kallsyms]  [k] tsc_refine_calibration_work
          71.87%    71.87%  swapper  [kernel.kallsyms]  [k] module_finalize
       ...
    
    After (for the same perf.data):
    
          72.15%     0.00%  swapper  vmlinux  [k] cpu_startup_entry
          72.15%     0.00%  swapper  vmlinux  [k] arch_cpu_idle
          72.15%     0.00%  swapper  vmlinux  [k] default_idle
          71.87%    71.87%  swapper  vmlinux  [k] native_safe_halt
       ...
    Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
    Acked-by: default avatarIngo Molnar <mingo@kernel.org>
    Link: http://lkml.kernel.org/r/20140924073356.GB1962@gmail.com
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung.kim@lge.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Stephane Eranian <eranian@google.com>
    Link: http://lkml.kernel.org/r/1415063674-17206-8-git-send-email-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    b837a8bd
header.c 59.7 KB