lkml.org 
[lkml]   [2015]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 27/38] perf callchain: Maintain libunwind's address space in map_groups
    Date
    Currently the address_space was kept in thread struct but it's more
    appropriate to keep it in map_groups as it's maintained with time.
    Also we don't need to flush after exec since it still can be accessed
    when used with an indexed data file.

    Signed-off-by: Namhyung Kim <namhyung@kernel.org>
    ---
    tools/perf/tests/dwarf-unwind.c | 4 ++--
    tools/perf/util/map.c | 5 +++++
    tools/perf/util/map.h | 1 +
    tools/perf/util/thread.c | 8 --------
    tools/perf/util/unwind-libunwind.c | 28 +++++++++++++---------------
    tools/perf/util/unwind.h | 15 ++++++---------
    6 files changed, 27 insertions(+), 34 deletions(-)

    diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c
    index 241270374e93..0fa26e77e28a 100644
    --- a/tools/perf/tests/dwarf-unwind.c
    +++ b/tools/perf/tests/dwarf-unwind.c
    @@ -143,6 +143,8 @@ int test__dwarf_unwind(void)
    struct thread *thread;
    int err = -1;

    + callchain_param.record_mode = CALLCHAIN_DWARF;
    +
    machines__init(&machines);

    machine = machines__find(&machines, HOST_KERNEL_ID);
    @@ -151,8 +153,6 @@ int test__dwarf_unwind(void)
    return -1;
    }

    - callchain_param.record_mode = CALLCHAIN_DWARF;
    -
    if (init_live_machine(machine)) {
    pr_err("Could not init machine\n");
    goto out;
    diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
    index 85fbb1b3e69f..c7eeabafa6c9 100644
    --- a/tools/perf/util/map.c
    +++ b/tools/perf/util/map.c
    @@ -14,6 +14,7 @@
    #include "util.h"
    #include "debug.h"
    #include "machine.h"
    +#include "unwind.h"
    #include <linux/string.h>

    const char *map_type__name[MAP__NR_TYPES] = {
    @@ -424,6 +425,8 @@ void map_groups__init(struct map_groups *mg, struct machine *machine)
    mg->refcnt = 1;
    mg->timestamp = 0;
    INIT_LIST_HEAD(&mg->list);
    +
    + unwind__prepare_access(mg);
    }

    static void maps__delete(struct rb_root *maps)
    @@ -457,6 +460,8 @@ void map_groups__exit(struct map_groups *mg)
    maps__delete(&mg->maps[i]);
    maps__delete_removed(&mg->removed_maps[i]);
    }
    +
    + unwind__finish_access(mg);
    }

    bool map_groups__empty(struct map_groups *mg)
    diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h
    index f33d49029ac0..f7db4a010dc8 100644
    --- a/tools/perf/util/map.h
    +++ b/tools/perf/util/map.h
    @@ -64,6 +64,7 @@ struct map_groups {
    u64 timestamp;
    int refcnt;
    struct list_head list;
    + void *priv;
    };

    struct map_groups *map_groups__new(struct machine *machine);
    diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
    index 9ae1ce8606af..552e1a56af6a 100644
    --- a/tools/perf/util/thread.c
    +++ b/tools/perf/util/thread.c
    @@ -8,7 +8,6 @@
    #include "util.h"
    #include "debug.h"
    #include "comm.h"
    -#include "unwind.h"

    struct map_groups *thread__get_map_groups(struct thread *thread, u64 timestamp)
    {
    @@ -104,9 +103,6 @@ struct thread *thread__new(pid_t pid, pid_t tid)
    INIT_LIST_HEAD(&thread->tid_node);
    INIT_LIST_HEAD(&thread->mg_list);

    - if (unwind__prepare_access(thread) < 0)
    - goto err_thread;
    -
    comm_str = malloc(32);
    if (!comm_str)
    goto err_thread;
    @@ -147,7 +143,6 @@ void thread__delete(struct thread *thread)
    list_del(&comm->list);
    comm__free(comm);
    }
    - unwind__finish_access(thread);

    free(thread);
    }
    @@ -216,9 +211,6 @@ int __thread__set_comm(struct thread *thread, const char *str, u64 timestamp,
    break;
    }
    list_add_tail(&new->list, &curr->list);
    -
    - if (exec)
    - unwind__flush_access(thread);
    }

    if (exec) {
    diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
    index 9ee63179383e..9d7ecb26fde9 100644
    --- a/tools/perf/util/unwind-libunwind.c
    +++ b/tools/perf/util/unwind-libunwind.c
    @@ -32,6 +32,7 @@
    #include "symbol.h"
    #include "util.h"
    #include "debug.h"
    +#include "map.h"

    extern int
    UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as,
    @@ -560,7 +561,7 @@ static unw_accessors_t accessors = {
    .get_proc_name = get_proc_name,
    };

    -int unwind__prepare_access(struct thread *thread)
    +int unwind__prepare_access(struct map_groups *mg)
    {
    unw_addr_space_t addr_space;

    @@ -574,41 +575,38 @@ int unwind__prepare_access(struct thread *thread)
    }

    unw_set_caching_policy(addr_space, UNW_CACHE_GLOBAL);
    - thread__set_priv(thread, addr_space);
    + mg->priv = addr_space;

    return 0;
    }

    -void unwind__flush_access(struct thread *thread)
    +void unwind__finish_access(struct map_groups *mg)
    {
    - unw_addr_space_t addr_space;
    + unw_addr_space_t addr_space = mg->priv;

    if (callchain_param.record_mode != CALLCHAIN_DWARF)
    return;

    - addr_space = thread__priv(thread);
    - unw_flush_cache(addr_space, 0, 0);
    -}
    -
    -void unwind__finish_access(struct thread *thread)
    -{
    - unw_addr_space_t addr_space;
    -
    - if (callchain_param.record_mode != CALLCHAIN_DWARF)
    + if (addr_space == NULL)
    return;

    - addr_space = thread__priv(thread);
    unw_destroy_addr_space(addr_space);
    + mg->priv = NULL;
    }

    static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
    void *arg, int max_stack)
    {
    + struct map_groups *mg;
    unw_addr_space_t addr_space;
    unw_cursor_t c;
    int ret;

    - addr_space = thread__priv(ui->thread);
    + mg = thread__get_map_groups(ui->thread, ui->sample->time);
    + if (mg == NULL)
    + return -1;
    +
    + addr_space = mg->priv;
    if (addr_space == NULL)
    return -1;

    diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h
    index c619890e60ad..b3833eaf4c3b 100644
    --- a/tools/perf/util/unwind.h
    +++ b/tools/perf/util/unwind.h
    @@ -21,17 +21,15 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
    /* libunwind specific */
    #ifdef HAVE_LIBUNWIND_SUPPORT
    int libunwind__arch_reg_id(int regnum);
    -int unwind__prepare_access(struct thread *thread);
    -void unwind__flush_access(struct thread *thread);
    -void unwind__finish_access(struct thread *thread);
    +int unwind__prepare_access(struct map_groups *mg);
    +void unwind__finish_access(struct map_groups *mg);
    #else
    -static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
    +static inline int unwind__prepare_access(struct map_groups *mg __maybe_unused)
    {
    return 0;
    }

    -static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
    -static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
    +static inline void unwind__finish_access(struct map_groups *mg __maybe_unused) {}
    #endif
    #else
    static inline int
    @@ -45,12 +43,11 @@ unwind__get_entries(unwind_entry_cb_t cb __maybe_unused,
    return 0;
    }

    -static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
    +static inline int unwind__prepare_access(struct map_groups *mg __maybe_unused)
    {
    return 0;
    }

    -static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
    -static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
    +static inline void unwind__finish_access(struct map_groups *mg __maybe_unused) {}
    #endif /* HAVE_DWARF_UNWIND_SUPPORT */
    #endif /* __UNWIND_H */
    --
    2.2.2


    \
     
     \ /
      Last update: 2015-03-03 04:41    [W:4.042 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site