]> Git Repo - linux.git/blobdiff - tools/perf/util/unwind-libunwind.c
perf tools: A thread's machine can be found via thread->mg->machine
[linux.git] / tools / perf / util / unwind-libunwind.c
index 92b56db5247193fb4c74f6d88cd5d49a542087ad..29acc8cccb5643d962ef42e05734516adedf466f 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/list.h>
 #include <libunwind.h>
 #include <libunwind-ptrace.h>
+#include "callchain.h"
 #include "thread.h"
 #include "session.h"
 #include "perf_regs.h"
@@ -283,7 +284,7 @@ static struct map *find_map(unw_word_t ip, struct unwind_info *ui)
 {
        struct addr_location al;
 
-       thread__find_addr_map(ui->thread, ui->machine, PERF_RECORD_MISC_USER,
+       thread__find_addr_map(ui->thread, PERF_RECORD_MISC_USER,
                              MAP__FUNCTION, ip, &al);
        return al.map;
 }
@@ -373,7 +374,7 @@ static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
        struct addr_location al;
        ssize_t size;
 
-       thread__find_addr_map(ui->thread, ui->machine, PERF_RECORD_MISC_USER,
+       thread__find_addr_map(ui->thread, PERF_RECORD_MISC_USER,
                              MAP__FUNCTION, addr, &al);
        if (!al.map) {
                pr_debug("unwind: no map for %lx\n", (unsigned long)addr);
@@ -475,14 +476,13 @@ static void put_unwind_info(unw_addr_space_t __maybe_unused as,
        pr_debug("unwind: put_unwind_info called\n");
 }
 
-static int entry(u64 ip, struct thread *thread, struct machine *machine,
+static int entry(u64 ip, struct thread *thread,
                 unwind_entry_cb_t cb, void *arg)
 {
        struct unwind_entry e;
        struct addr_location al;
 
-       thread__find_addr_location(thread, machine,
-                                  PERF_RECORD_MISC_USER,
+       thread__find_addr_location(thread, PERF_RECORD_MISC_USER,
                                   MAP__FUNCTION, ip, &al);
 
        e.ip = ip;
@@ -525,12 +525,12 @@ static unw_accessors_t accessors = {
        .get_proc_name          = get_proc_name,
 };
 
-static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
-                      void *arg, int max_stack)
+int unwind__prepare_access(struct thread *thread)
 {
        unw_addr_space_t addr_space;
-       unw_cursor_t c;
-       int ret;
+
+       if (callchain_param.record_mode != CALLCHAIN_DWARF)
+               return 0;
 
        addr_space = unw_create_addr_space(&accessors, 0);
        if (!addr_space) {
@@ -538,6 +538,45 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
                return -ENOMEM;
        }
 
+       unw_set_caching_policy(addr_space, UNW_CACHE_GLOBAL);
+       thread__set_priv(thread, addr_space);
+
+       return 0;
+}
+
+void unwind__flush_access(struct thread *thread)
+{
+       unw_addr_space_t addr_space;
+
+       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)
+               return;
+
+       addr_space = thread__priv(thread);
+       unw_destroy_addr_space(addr_space);
+}
+
+static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
+                      void *arg, int max_stack)
+{
+       unw_addr_space_t addr_space;
+       unw_cursor_t c;
+       int ret;
+
+       addr_space = thread__priv(ui->thread);
+       if (addr_space == NULL)
+               return -1;
+
        ret = unw_init_remote(&c, addr_space, ui);
        if (ret)
                display_error(ret);
@@ -546,10 +585,9 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
                unw_word_t ip;
 
                unw_get_reg(&c, UNW_REG_IP, &ip);
-               ret = ip ? entry(ip, ui->thread, ui->machine, cb, arg) : 0;
+               ret = ip ? entry(ip, ui->thread, cb, arg) : 0;
        }
 
-       unw_destroy_addr_space(addr_space);
        return ret;
 }
 
@@ -572,7 +610,7 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
        if (ret)
                return ret;
 
-       ret = entry(ip, thread, machine, cb, arg);
+       ret = entry(ip, thread, cb, arg);
        if (ret)
                return -ENOMEM;
 
This page took 0.036049 seconds and 4 git commands to generate.