From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755765AbbCCDPl (ORCPT ); Mon, 2 Mar 2015 22:15:41 -0500 Received: from lgeamrelo01.lge.com ([156.147.1.125]:44683 "EHLO lgeamrelo01.lge.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754853AbbCCDMV (ORCPT ); Mon, 2 Mar 2015 22:12:21 -0500 X-Original-SENDERIP: 10.177.220.203 X-Original-MAILFROM: namhyung@kernel.org From: Namhyung Kim To: Arnaldo Carvalho de Melo Cc: Ingo Molnar , Peter Zijlstra , Jiri Olsa , LKML , Frederic Weisbecker , Adrian Hunter , Stephane Eranian , Andi Kleen , David Ahern Subject: [PATCH 27/38] perf callchain: Maintain libunwind's address space in map_groups Date: Tue, 3 Mar 2015 12:07:39 +0900 Message-Id: <1425352070-1115-28-git-send-email-namhyung@kernel.org> X-Mailer: git-send-email 2.2.2 In-Reply-To: <1425352070-1115-1-git-send-email-namhyung@kernel.org> References: <1425352070-1115-1-git-send-email-namhyung@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 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