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 <namhy...@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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to