From: He Kuang <hekuang@huawei.com>
To: <peterz@infradead.org>, <mingo@redhat.com>, <acme@kernel.org>,
<alexander.shishkin@linux.intel.com>, <jolsa@redhat.com>,
<wangnan0@huawei.com>, <hekuang@huawei.com>,
<jpoimboe@redhat.com>, <ak@linux.intel.com>, <eranian@google.com>,
<namhyung@kernel.org>, <adrian.hunter@intel.com>,
<sukadev@linux.vnet.ibm.com>, <masami.hiramatsu.pt@hitachi.com>,
<tumanova@linux.vnet.ibm.com>, <kan.liang@intel.com>,
<penberg@kernel.org>, <dsahern@gmail.com>
Cc: <linux-kernel@vger.kernel.org>
Subject: [PATCH v2 6/9] perf tools: Promote proper messages for cross-platform unwind
Date: Tue, 10 May 2016 07:40:34 +0000 [thread overview]
Message-ID: <1462866037-30382-7-git-send-email-hekuang@huawei.com> (raw)
In-Reply-To: <1462866037-30382-1-git-send-email-hekuang@huawei.com>
Currently, perf script uses host unwind methods to parse perf.data
callchain info regardless of the target architecture. So we get wrong
result and no promotion when unwinding callchains of x86(32-bit) on
x86(64-bit) machine.
This patch shows proper error messages when we do remote unwind
x86(32-bit) on other machines.
Same thing for other platforms will be added in next patches.
Signed-off-by: He Kuang <hekuang@huawei.com>
---
tools/perf/config/Makefile | 6 ++++++
tools/perf/util/thread.c | 2 ++
tools/perf/util/unwind-libunwind.c | 32 ++++++++++++++++++++++++++++++++
tools/perf/util/unwind.h | 5 +++++
4 files changed, 45 insertions(+)
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 1e46277..a86b864 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -345,6 +345,12 @@ ifeq ($(ARCH),powerpc)
endif
ifndef NO_LIBUNWIND
+ ifeq ($(feature-libunwind-x86), 1)
+ LIBUNWIND_LIBS += -lunwind-x86
+ $(call detected,CONFIG_LIBUNWIND_X86)
+ CFLAGS += -DHAVE_LIBUNWIND_X86_SUPPORT
+ endif
+
ifneq ($(feature-libunwind), 1)
msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
NO_LIBUNWIND := 1
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
index dfd00c6..244c4f6 100644
--- a/tools/perf/util/thread.c
+++ b/tools/perf/util/thread.c
@@ -186,6 +186,8 @@ void thread__insert_map(struct thread *thread, struct map *map)
{
map_groups__fixup_overlappings(thread->mg, map, stderr);
map_groups__insert(thread->mg, map);
+
+ unwind__get_arch(thread, map);
}
static int thread__clone_map_groups(struct thread *thread,
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
index 63687d3..b6eb317 100644
--- a/tools/perf/util/unwind-libunwind.c
+++ b/tools/perf/util/unwind-libunwind.c
@@ -680,3 +680,35 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
return get_entries(&ui, cb, arg, max_stack);
}
+
+void unwind__get_arch(struct thread *thread, struct map *map)
+{
+ char *arch;
+ int is_64_bit;
+
+ if (!thread->mg->machine->env)
+ return;
+
+ is_64_bit = dso_is_64_bit(map->dso, map);
+ if (is_64_bit < 0)
+ return;
+
+ if (thread->addr_space)
+ pr_debug("Thread map already set, 64bit is %d, dso=%s\n",
+ is_64_bit, map->dso->name);
+
+ arch = thread->mg->machine->env->arch;
+
+ if (!strcmp(arch, "x86_64")
+ || !strcmp(arch, "x86")
+ || !strcmp(arch, "i686")) {
+ pr_debug("Thread map is X86, 64bit is %d\n", is_64_bit);
+ if (!is_64_bit)
+#ifdef HAVE_LIBUNWIND_X86_SUPPORT
+ pr_err("target platform=%s is not implemented!\n",
+ arch);
+#else
+ pr_err("target platform=%s is not supported!\n", arch);
+#endif
+ }
+}
diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h
index 12790cf..889d630 100644
--- a/tools/perf/util/unwind.h
+++ b/tools/perf/util/unwind.h
@@ -24,6 +24,7 @@ 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);
+void unwind__get_arch(struct thread *thread, struct map *map);
#else
static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
{
@@ -32,6 +33,8 @@ static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
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__get_arch(struct thread *thread __maybe_unused,
+ struct map *map __maybe_unused) {}
#endif
#else
static inline int
@@ -51,5 +54,7 @@ static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
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__get_arch(struct thread *thread __maybe_unused,
+ struct map *map __maybe_unused) {}
#endif /* HAVE_DWARF_UNWIND_SUPPORT */
#endif /* __UNWIND_H */
--
1.8.5.2
next prev parent reply other threads:[~2016-05-10 7:41 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-10 7:40 [PATCH v2 0/9] Add support for remote unwind He Kuang
2016-05-10 7:40 ` [PATCH v2 1/9] perf tools: Omit DWARF judgement when recording dwarf callchain He Kuang
2016-05-10 13:45 ` Arnaldo Carvalho de Melo
2016-05-10 7:40 ` [PATCH v2 2/9] perf script: Add options for custom vdso path He Kuang
2016-05-10 13:44 ` Arnaldo Carvalho de Melo
2016-05-11 1:33 ` Hekuang
2016-05-10 7:40 ` [PATCH v2 3/9] perf build: Add build-test for libunwind cross-platforms support He Kuang
2016-05-11 11:52 ` Jiri Olsa
2016-05-11 13:24 ` Arnaldo Carvalho de Melo
2016-05-12 10:23 ` [tip:perf/core] " tip-bot for He Kuang
2016-05-10 7:40 ` [PATCH v2 4/9] perf build: Add build-test for debug-frame on arm/arm64 He Kuang
2016-05-11 11:58 ` Jiri Olsa
2016-05-11 13:24 ` Arnaldo Carvalho de Melo
2016-05-12 10:24 ` [tip:perf/core] " tip-bot for He Kuang
2016-05-10 7:40 ` [PATCH v2 5/9] perf tools: Add methods to test dso is 64-bit or 32-bit He Kuang
2016-05-10 8:08 ` Adrian Hunter
2016-05-10 9:49 ` Hekuang
2016-05-10 10:34 ` Adrian Hunter
2016-05-10 11:38 ` Hekuang
2016-05-10 11:59 ` Adrian Hunter
2016-05-10 12:29 ` Hekuang
2016-05-10 7:40 ` He Kuang [this message]
2016-05-10 7:40 ` [PATCH v2 7/9] perf callchain: Add support for cross-platform unwind He Kuang
2016-05-10 7:40 ` [PATCH v2 8/9] perf callchain: Support x86 target platform He Kuang
2016-05-10 7:40 ` [PATCH v2 9/9] perf callchain: Support aarch64 cross-platform He Kuang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1462866037-30382-7-git-send-email-hekuang@huawei.com \
--to=hekuang@huawei.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=dsahern@gmail.com \
--cc=eranian@google.com \
--cc=jolsa@redhat.com \
--cc=jpoimboe@redhat.com \
--cc=kan.liang@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=penberg@kernel.org \
--cc=peterz@infradead.org \
--cc=sukadev@linux.vnet.ibm.com \
--cc=tumanova@linux.vnet.ibm.com \
--cc=wangnan0@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®