• Masami Hiramatsu's avatar
    perf machine: Fix machine__findnew_module_map to put dso · 566c69c3
    Masami Hiramatsu authored
    Fix machine__findnew_module_map to drop the reference to the dso because
    it is already referenced by both machine__findnew_module_dso() and
    map__new2().
    
    Refcnt debugger shows:
    
      ==== [1] ====
      Unreclaimed dso: 0x1ffd980
      Refcount +1 => 1 at
        ./perf(dso__new+0x1ff) [0x4a62df]
        ./perf(__dsos__addnew+0x29) [0x4a6e19]
        ./perf() [0x4b8b91]
        ./perf(modules__parse+0xfc) [0x4a9d5c]
        ./perf() [0x4b8460]
        ./perf(machine__create_kernel_maps+0x150) [0x4bb550]
        ./perf(machine__new_host+0xfa) [0x4bb75a]
        ./perf(init_probe_symbol_maps+0x93) [0x506623]
        ./perf() [0x455ffa]
        ./perf(cmd_probe+0x6c) [0x4566bc]
        ./perf() [0x47abc5]
        ./perf(main+0x610) [0x421f90]
        /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f1345a8eaf5]
        ./perf() [0x4220a9]
    
    This map_groups__insert(0x4b8b91) already gets a reference to the new
    dso:
    
      ----
      eu-addr2line -e ./perf -f 0x4b8b91
      map_groups__insert inlined at util/machine.c:586 in
      machine__create_module
      util/map.h:207
      ----
    
    So this dso refcnt will be released when map_groups gets released.
    
      [snip]
      Refcount +1 => 2 at
        ./perf(dso__get+0x34) [0x4a65f4]
        ./perf() [0x4b8b35]
        ./perf(modules__parse+0xfc) [0x4a9d5c]
        ./perf() [0x4b8460]
        ./perf(machine__create_kernel_maps+0x150) [0x4bb550]
        ./perf(machine__new_host+0xfa) [0x4bb75a]
        ./perf(init_probe_symbol_maps+0x93) [0x506623]
        ./perf() [0x455ffa]
        ./perf(cmd_probe+0x6c) [0x4566bc]
        ./perf() [0x47abc5]
        ./perf(main+0x610) [0x421f90]
        /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f1345a8eaf5]
        ./perf() [0x4220a9]
    
    Here, machine__findnew_module_dso(0x4b8b35) gets the dso (and stores it
    in a local variable):
    
      ----
      # eu-addr2line -e ./perf -f 0x4b8b35
      machine__findnew_module_dso inlined at util/machine.c:578 in
      machine__create_module
      util/machine.c:514
      ----
    
      Refcount +1 => 3 at
        ./perf(dso__get+0x34) [0x4a65f4]
        ./perf(map__new2+0x76) [0x4be1c6]
        ./perf() [0x4b8b4f]
        ./perf(modules__parse+0xfc) [0x4a9d5c]
        ./perf() [0x4b8460]
        ./perf(machine__create_kernel_maps+0x150) [0x4bb550]
        ./perf(machine__new_host+0xfa) [0x4bb75a]
        ./perf(init_probe_symbol_maps+0x93) [0x506623]
        ./perf() [0x455ffa]
        ./perf(cmd_probe+0x6c) [0x4566bc]
        ./perf() [0x47abc5]
        ./perf(main+0x610) [0x421f90]
        /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f1345a8eaf5]
        ./perf() [0x4220a9]
    
    But also map__new2() gets the dso which will be put when the map is
    released.
    
    So, we have to drop the constructor reference obtained in
    machine__findnew_module_dso().
    Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20151118064035.30709.58824.stgit@localhost.localdomainSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    566c69c3
machine.c 48.9 KB