lkml.org 
[lkml]   [2015]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 21/37] perf machine: Fix machine__findnew_module_map to put registered map
    Date
    From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

    Fix machine object to drop the reference to the map object after it
    inserted it into machine->kmaps.

    refcnt debugger shows what happened:
    ----
    ==== [2] ====
    Unreclaimed map: 0x346f750
    Refcount +1 => 1 at
    ./perf(map__new2+0xb5) [0x4bdea5]
    ./perf() [0x4b8aaf]
    ./perf(modules__parse+0xfc) [0x4a9cbc]
    ./perf() [0x4b83c0]
    ./perf(machine__create_kernel_maps+0x148) [0x4bb208]
    ./perf(machine__new_host+0xfa) [0x4bb3fa]
    ./perf(init_probe_symbol_maps+0x93) [0x5062b3]
    ./perf() [0x455ffa]
    ./perf(cmd_probe+0x6c) [0x4566bc]
    ./perf() [0x47abc5]
    ./perf(main+0x610) [0x421f90]
    /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f5373899af5]
    ./perf() [0x4220a9]
    Refcount +1 => 2 at
    ./perf(maps__insert+0x9a) [0x4bfd4a]
    ./perf() [0x4b8acb]
    ./perf(modules__parse+0xfc) [0x4a9cbc]
    ./perf() [0x4b83c0]
    ./perf(machine__create_kernel_maps+0x148) [0x4bb208]
    ./perf(machine__new_host+0xfa) [0x4bb3fa]
    ./perf(init_probe_symbol_maps+0x93) [0x5062b3]
    ./perf() [0x455ffa]
    ./perf(cmd_probe+0x6c) [0x4566bc]
    ./perf() [0x47abc5]
    ./perf(main+0x610) [0x421f90]
    /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f5373899af5]
    ./perf() [0x4220a9]
    Refcount -1 => 1 at
    ./perf(map_groups__exit+0x94) [0x4bea54]
    ./perf(machine__delete+0x3d) [0x4b91ed]
    ./perf(exit_probe_symbol_maps+0x28) [0x506358]
    ./perf() [0x45628a]
    ./perf(cmd_probe+0x6c) [0x4566bc]
    ./perf() [0x47abc5]
    ./perf(main+0x610) [0x421f90]
    /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f5373899af5]
    ./perf() [0x4220a9]
    ----

    This pattern clearly shows that the refcnt of the map is acquired twice
    by map__new2 and maps__insert but released onlu once at
    map_groups__exit, when we purge its maps rbtree.

    Since maps__insert already reference counted the map, we have to drop
    the constructor (map__new2) reference count right after inserting it.

    These happened in machine__findnew_module_map, as below.

    ----
    # eu-addr2line -e ./perf -f 0x4b8aaf
    machine__findnew_module_map inlined at util/machine.c:1046
    in machine__create_module
    util/machine.c:582
    # eu-addr2line -e ./perf -f 0x4b8acb
    map_groups__insert inlined at util/machine.c:585
    in machine__create_module
    util/map.h:208
    ----

    (note that both are at util/machine.c:58X which is
    machine__findnew_module_map)

    Signed-off-by: Masami 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/20151118064020.30709.40499.stgit@localhost.localdomain
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/util/machine.c | 2 ++
    1 file changed, 2 insertions(+)

    diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
    index 8b303ff20289..0487d7795f13 100644
    --- a/tools/perf/util/machine.c
    +++ b/tools/perf/util/machine.c
    @@ -585,6 +585,8 @@ struct map *machine__findnew_module_map(struct machine *machine, u64 start,

    map_groups__insert(&machine->kmaps, map);

    + /* Put the map here because map_groups__insert alread got it */
    + map__put(map);
    out:
    free(m.name);
    return map;
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-11-19 19:21    [W:4.185 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site