linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v8 00/14] Add support for remote unwind
@ 2016-06-02  9:55 He Kuang
  2016-06-02  9:55 ` [PATCH v8 01/14] perf tools: Use LIBUNWIND_DIR for remote libunwind feature check He Kuang
                   ` (14 more replies)
  0 siblings, 15 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

v7 url:
  http://thread.gmane.org/gmane.linux.kernel/2231229/focus=2232166

Currently, perf script uses host unwind methods(local unwind) to parse
perf.data callchain info regardless of the target architecture. So we
get wrong result and no promotion when do remote unwind on other
platforms/machines.

This patchset checks whether a dso is 32-bit or 64-bit according to
elf class info for each thread to let perf use the correct remote
unwind methods instead.

Only x86 and aarch64 is added in this patchset to show the work flow,
other platforms can be added easily.

We can see the right result for unwind info on different machines, for
example: perf.data recorded on i686 qemu with '-g' option and parsed
on x86_64 machine.

before this patchset:

  hello  1219 [001] 72190.667975: probe:sys_close: (c1169d60)
                  c1169d61 sys_close ([kernel.kallsyms])
                  c189c0d7 sysenter_past_esp ([kernel.kallsyms])
                  b777aba9 [unknown] ([vdso32])

after:
(Add vdso into buildid-cache first by 'perf buildid-cache -a' and
libraries are provided in symfs dir)

  hello  1219 [001] 72190.667975: probe:sys_close: (c1169d60)
                  c1169d61 sys_close ([kernel.kallsyms])
                  c189c0d7 sysenter_past_esp ([kernel.kallsyms])
                  b777aba9 __kernel_vsyscall ([vdso32])
                  b76971cc close (/lib/libc-2.22.so)
                   804842e fib (/tmp/hello)
                   804849d main (/tmp/hello)
                  b75d746e __libc_start_main (/lib/libc-2.22.so)
                   8048341 _start (/tmp/hello)

For using remote libunwind libraries, reference this:
  http://thread.gmane.org/gmane.linux.kernel/2224430

and now we can use LIBUNWIND_DIR to specific custom dirctories
containing libunwind libs.

v8:

 - Put unwind__register_ops call into unwind__prepare_access from
   patch 4 to patch 3.
 - Fail thread__insert_map on error.
 - Remove unused macro HAVE_LIBUNWIND_LOCAL_SUPPORT.
 - Return once find that thread->addr_space is valid and check this
   value first.
 - Add comments in file 'util/libunwind/arm64.c',
   'util/libunwind/x86_32.c', and explain the reason for debug-frame
   flag in non-arm arch.

Thanks.

He Kuang (14):
  perf tools: Use LIBUNWIND_DIR for remote libunwind feature check
  perf tools: Decouple thread->address_space on libunwind
  perf tools: Introducing struct unwind_libunwind_ops for local unwind
  perf tools: Move unwind__prepare_access from thread_new into
    thread__insert_map
  perf tools: Don't mix LIBUNWIND_LIBS into LIBUNWIND_LDFLAGS
  perf tools: Separate local/remote libunwind config
  perf tools: Rename unwind-libunwind.c to unwind-libunwind-local.c
  perf tools: Extract common API out of unwind-libunwind-local.c
  perf tools: Export normalize_arch() function
  perf tools: Check the target platform before assigning unwind methods
  perf tools: Change fixed name of libunwind__arch_reg_id to macro
  perf tools: Introduce flag to separate local/remote unwind compilation
  perf callchain: Support x86 target platform
  perf callchain: Support aarch64 cross-platform

 tools/perf/arch/arm/util/Build                |   2 +-
 tools/perf/arch/arm64/util/Build              |   2 +-
 tools/perf/arch/arm64/util/unwind-libunwind.c |   4 +-
 tools/perf/arch/common.c                      |   2 +-
 tools/perf/arch/common.h                      |   1 +
 tools/perf/arch/x86/util/Build                |   2 +-
 tools/perf/arch/x86/util/unwind-libunwind.c   |   6 +-
 tools/perf/config/Makefile                    |  52 +-
 tools/perf/util/Build                         |   3 +
 tools/perf/util/libunwind/arm64.c             |  35 ++
 tools/perf/util/libunwind/x86_32.c            |  37 ++
 tools/perf/util/machine.c                     |  14 +-
 tools/perf/util/thread.c                      |  13 +-
 tools/perf/util/thread.h                      |   9 +-
 tools/perf/util/unwind-libunwind-local.c      | 697 ++++++++++++++++++++++++++
 tools/perf/util/unwind-libunwind.c            | 691 ++-----------------------
 tools/perf/util/unwind.h                      |  27 +-
 17 files changed, 924 insertions(+), 673 deletions(-)
 create mode 100644 tools/perf/util/libunwind/arm64.c
 create mode 100644 tools/perf/util/libunwind/x86_32.c
 create mode 100644 tools/perf/util/unwind-libunwind-local.c

-- 
1.8.5.2

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v8 01/14] perf tools: Use LIBUNWIND_DIR for remote libunwind feature check
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 02/14] perf tools: Decouple thread->address_space on libunwind He Kuang
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Pass LIBUNWIND_DIR to feature check flags for remote libunwind
tests. So perf can be able to detect remote libunwind libraries from
arbitrary directory.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/config/Makefile | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 1e46277..6f9f566 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -67,9 +67,18 @@ endif
 #
 #   make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
 #
+
+libunwind_arch_set_flags = $(eval $(libunwind_arch_set_flags_code))
+define libunwind_arch_set_flags_code
+  FEATURE_CHECK_CFLAGS-libunwind-$(1)  = -I$(LIBUNWIND_DIR)/include
+  FEATURE_CHECK_LDFLAGS-libunwind-$(1) = -L$(LIBUNWIND_DIR)/lib
+endef
+
 ifdef LIBUNWIND_DIR
   LIBUNWIND_CFLAGS  = -I$(LIBUNWIND_DIR)/include
   LIBUNWIND_LDFLAGS = -L$(LIBUNWIND_DIR)/lib
+  LIBUNWIND_ARCHS = x86 x86_64 arm aarch64 debug-frame-arm debug-frame-aarch64
+  $(foreach libunwind_arch,$(LIBUNWIND_ARCHS),$(call libunwind_arch_set_flags,$(libunwind_arch)))
 endif
 LIBUNWIND_LDFLAGS += $(LIBUNWIND_LIBS)
 
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 02/14] perf tools: Decouple thread->address_space on libunwind
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
  2016-06-02  9:55 ` [PATCH v8 01/14] perf tools: Use LIBUNWIND_DIR for remote libunwind feature check He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 03/14] perf tools: Introducing struct unwind_libunwind_ops for local unwind He Kuang
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Currently, the type of thread->addr_space is unw_addr_space_t, which
is a pointer defined in libunwind headers. For local libunwind, we can
simple include "libunwind.h", but for remote libunwind, the header
file is depends on the target libunwind platform. This patch uses
'void *' instead to decouple the dependence on libunwind.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/thread.h | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h
index 45fba13..aa3a8ff 100644
--- a/tools/perf/util/thread.h
+++ b/tools/perf/util/thread.h
@@ -9,9 +9,6 @@
 #include "symbol.h"
 #include <strlist.h>
 #include <intlist.h>
-#ifdef HAVE_LIBUNWIND_SUPPORT
-#include <libunwind.h>
-#endif
 
 struct thread_stack;
 
@@ -36,7 +33,7 @@ struct thread {
 	void			*priv;
 	struct thread_stack	*ts;
 #ifdef HAVE_LIBUNWIND_SUPPORT
-	unw_addr_space_t	addr_space;
+	void			*addr_space;
 #endif
 };
 
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 03/14] perf tools: Introducing struct unwind_libunwind_ops for local unwind
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
  2016-06-02  9:55 ` [PATCH v8 01/14] perf tools: Use LIBUNWIND_DIR for remote libunwind feature check He Kuang
  2016-06-02  9:55 ` [PATCH v8 02/14] perf tools: Decouple thread->address_space on libunwind He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02 20:34   ` Jiri Olsa
  2016-06-02  9:55 ` [PATCH v8 04/14] perf tools: Move unwind__prepare_access from thread_new into thread__insert_map He Kuang
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Currently, libunwind operations are fixed, and they are chosen
according to the host architecture. This will lead a problem that if a
thread is run as x86_32 on x86_64 machine, perf will use libunwind
methods for x86_64 to parse the callchain and get wrong result.

This patch changes the fixed methods of libunwind operations to
thread/map related, and each thread can have indivadual libunwind
operations. Local libunwind methods are registered as default value.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/thread.h           |  4 ++-
 tools/perf/util/unwind-libunwind.c | 57 +++++++++++++++++++++++++++++++++++---
 tools/perf/util/unwind.h           | 19 +++++++++++++
 3 files changed, 75 insertions(+), 5 deletions(-)

diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h
index aa3a8ff..152fb9a 100644
--- a/tools/perf/util/thread.h
+++ b/tools/perf/util/thread.h
@@ -11,6 +11,7 @@
 #include <intlist.h>
 
 struct thread_stack;
+struct unwind_libunwind_ops;
 
 struct thread {
 	union {
@@ -33,7 +34,8 @@ struct thread {
 	void			*priv;
 	struct thread_stack	*ts;
 #ifdef HAVE_LIBUNWIND_SUPPORT
-	void			*addr_space;
+	void				*addr_space;
+	struct unwind_libunwind_ops	*unwind_libunwind_ops;
 #endif
 };
 
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
index 63687d3..e35c5bfda 100644
--- a/tools/perf/util/unwind-libunwind.c
+++ b/tools/perf/util/unwind-libunwind.c
@@ -579,7 +579,7 @@ static unw_accessors_t accessors = {
 	.get_proc_name		= get_proc_name,
 };
 
-int unwind__prepare_access(struct thread *thread)
+static int _unwind__prepare_access(struct thread *thread)
 {
 	if (callchain_param.record_mode != CALLCHAIN_DWARF)
 		return 0;
@@ -594,7 +594,7 @@ int unwind__prepare_access(struct thread *thread)
 	return 0;
 }
 
-void unwind__flush_access(struct thread *thread)
+static void _unwind__flush_access(struct thread *thread)
 {
 	if (callchain_param.record_mode != CALLCHAIN_DWARF)
 		return;
@@ -602,7 +602,7 @@ void unwind__flush_access(struct thread *thread)
 	unw_flush_cache(thread->addr_space, 0, 0);
 }
 
-void unwind__finish_access(struct thread *thread)
+static void _unwind__finish_access(struct thread *thread)
 {
 	if (callchain_param.record_mode != CALLCHAIN_DWARF)
 		return;
@@ -662,7 +662,7 @@ static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb,
 	return ret;
 }
 
-int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
+static int _unwind__get_entries(unwind_entry_cb_t cb, void *arg,
 			struct thread *thread,
 			struct perf_sample *data, int max_stack)
 {
@@ -680,3 +680,52 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
 
 	return get_entries(&ui, cb, arg, max_stack);
 }
+
+static struct unwind_libunwind_ops
+_unwind_libunwind_ops = {
+	.prepare_access = _unwind__prepare_access,
+	.flush_access   = _unwind__flush_access,
+	.finish_access  = _unwind__finish_access,
+	.get_entries    = _unwind__get_entries,
+};
+
+struct unwind_libunwind_ops *
+local_unwind_libunwind_ops = &_unwind_libunwind_ops;
+
+void unwind__register_ops(struct thread *thread,
+			  struct unwind_libunwind_ops *ops)
+{
+	thread->unwind_libunwind_ops = ops;
+}
+
+int unwind__prepare_access(struct thread *thread)
+{
+	unwind__register_ops(thread, local_unwind_libunwind_ops);
+
+	return thread->unwind_libunwind_ops->prepare_access(thread);
+}
+
+void unwind__flush_access(struct thread *thread)
+{
+	if (thread->unwind_libunwind_ops)
+		thread->unwind_libunwind_ops->flush_access(thread);
+}
+
+void unwind__finish_access(struct thread *thread)
+{
+	if (thread->unwind_libunwind_ops)
+		thread->unwind_libunwind_ops->finish_access(thread);
+}
+
+int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
+			 struct thread *thread,
+			 struct perf_sample *data, int max_stack)
+{
+	if (thread->unwind_libunwind_ops)
+		return thread->unwind_libunwind_ops->get_entries(cb, arg,
+								 thread,
+								 data,
+								 max_stack);
+	else
+		return 0;
+}
diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h
index 12790cf..bd7377b 100644
--- a/tools/perf/util/unwind.h
+++ b/tools/perf/util/unwind.h
@@ -14,6 +14,17 @@ struct unwind_entry {
 
 typedef int (*unwind_entry_cb_t)(struct unwind_entry *entry, void *arg);
 
+struct unwind_libunwind_ops {
+	int (*prepare_access)(struct thread *thread);
+	void (*flush_access)(struct thread *thread);
+	void (*finish_access)(struct thread *thread);
+	int (*get_entries)(unwind_entry_cb_t cb, void *arg,
+			   struct thread *thread,
+			   struct perf_sample *data, int max_stack);
+};
+
+struct unwind_libunwind_ops *local_unwind_libunwind_ops;
+
 #ifdef HAVE_DWARF_UNWIND_SUPPORT
 int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
 			struct thread *thread,
@@ -24,6 +35,8 @@ 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__register_ops(struct thread *thread,
+			  struct unwind_libunwind_ops *ops);
 #else
 static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
 {
@@ -32,6 +45,9 @@ 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__register_ops(struct thread *thread __maybe_unused,
+		     struct unwind_libunwind_ops *ops __maybe_unused) {}
 #endif
 #else
 static inline int
@@ -51,5 +67,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__register_ops(struct thread *thread __maybe_unused,
+		     struct unwind_libunwind_ops *ops __maybe_unused) {}
 #endif /* HAVE_DWARF_UNWIND_SUPPORT */
 #endif /* __UNWIND_H */
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 04/14] perf tools: Move unwind__prepare_access from thread_new into thread__insert_map
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (2 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 03/14] perf tools: Introducing struct unwind_libunwind_ops for local unwind He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02 20:33   ` Jiri Olsa
  2016-06-02  9:55 ` [PATCH v8 05/14] perf tools: Don't mix LIBUNWIND_LIBS into LIBUNWIND_LDFLAGS He Kuang
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

For determine the libunwind methods to use, we should get the
32bit/64bit information from maps of a thread. When a thread is newly
created, the information is not prepared. This patch moves
unwind__prepare_access() into thread__insert_map() so we can get the
information we need from maps. Meanwhile, let thread__insert_map()
return value and show messages on error.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/machine.c | 14 ++++++++++++--
 tools/perf/util/thread.c  | 13 +++++++++----
 tools/perf/util/thread.h  |  2 +-
 3 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index bdc33ce..ef4f785 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -1353,11 +1353,16 @@ int machine__process_mmap2_event(struct machine *machine,
 	if (map == NULL)
 		goto out_problem_map;
 
-	thread__insert_map(thread, map);
+	ret = thread__insert_map(thread, map);
+	if (ret)
+		goto out_problem_insert;
+
 	thread__put(thread);
 	map__put(map);
 	return 0;
 
+out_problem_insert:
+	map__put(map);
 out_problem_map:
 	thread__put(thread);
 out_problem:
@@ -1403,11 +1408,16 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event
 	if (map == NULL)
 		goto out_problem_map;
 
-	thread__insert_map(thread, map);
+	ret = thread__insert_map(thread, map);
+	if (ret)
+		goto out_problem_insert;
+
 	thread__put(thread);
 	map__put(map);
 	return 0;
 
+out_problem_insert:
+	map__put(map);
 out_problem_map:
 	thread__put(thread);
 out_problem:
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
index 45fcb71..a33e76c 100644
--- a/tools/perf/util/thread.c
+++ b/tools/perf/util/thread.c
@@ -43,9 +43,6 @@ struct thread *thread__new(pid_t pid, pid_t tid)
 		thread->cpu = -1;
 		INIT_LIST_HEAD(&thread->comm_list);
 
-		if (unwind__prepare_access(thread) < 0)
-			goto err_thread;
-
 		comm_str = malloc(32);
 		if (!comm_str)
 			goto err_thread;
@@ -201,10 +198,18 @@ size_t thread__fprintf(struct thread *thread, FILE *fp)
 	       map_groups__fprintf(thread->mg, fp);
 }
 
-void thread__insert_map(struct thread *thread, struct map *map)
+int thread__insert_map(struct thread *thread, struct map *map)
 {
+	int ret;
+
 	map_groups__fixup_overlappings(thread->mg, map, stderr);
 	map_groups__insert(thread->mg, map);
+
+	ret = unwind__prepare_access(thread);
+	if (ret)
+		map_groups__remove(thread->mg, map);
+
+	return ret;
 }
 
 static int thread__clone_map_groups(struct thread *thread,
diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h
index 152fb9a..e7a82a3 100644
--- a/tools/perf/util/thread.h
+++ b/tools/perf/util/thread.h
@@ -76,7 +76,7 @@ int thread__comm_len(struct thread *thread);
 struct comm *thread__comm(const struct thread *thread);
 struct comm *thread__exec_comm(const struct thread *thread);
 const char *thread__comm_str(const struct thread *thread);
-void thread__insert_map(struct thread *thread, struct map *map);
+int thread__insert_map(struct thread *thread, struct map *map);
 int thread__fork(struct thread *thread, struct thread *parent, u64 timestamp);
 size_t thread__fprintf(struct thread *thread, FILE *fp);
 
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 05/14] perf tools: Don't mix LIBUNWIND_LIBS into LIBUNWIND_LDFLAGS
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (3 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 04/14] perf tools: Move unwind__prepare_access from thread_new into thread__insert_map He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 06/14] perf tools: Separate local/remote libunwind config He Kuang
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

LIBUNWIND_LIBS contains libunwind libraries used for local only, don't
mix this into LIBUNWIND_LDFLAGS so we can later use LIBUNWIND_LDFLAGS
both for local and remote libunwind.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/config/Makefile | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 6f9f566..118df2d 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -80,13 +80,12 @@ ifdef LIBUNWIND_DIR
   LIBUNWIND_ARCHS = x86 x86_64 arm aarch64 debug-frame-arm debug-frame-aarch64
   $(foreach libunwind_arch,$(LIBUNWIND_ARCHS),$(call libunwind_arch_set_flags,$(libunwind_arch)))
 endif
-LIBUNWIND_LDFLAGS += $(LIBUNWIND_LIBS)
 
 # Set per-feature check compilation flags
 FEATURE_CHECK_CFLAGS-libunwind = $(LIBUNWIND_CFLAGS)
-FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS)
+FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
 FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS)
-FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS)
+FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
 
 ifeq ($(NO_PERF_REGS),0)
   CFLAGS += -DHAVE_PERF_REGS_SUPPORT
@@ -409,7 +408,7 @@ ifndef NO_LIBUNWIND
   CFLAGS  += -DHAVE_LIBUNWIND_SUPPORT
   EXTLIBS += $(LIBUNWIND_LIBS)
   CFLAGS  += $(LIBUNWIND_CFLAGS)
-  LDFLAGS += $(LIBUNWIND_LDFLAGS)
+  LDFLAGS += $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
 endif
 
 ifndef NO_LIBAUDIT
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 06/14] perf tools: Separate local/remote libunwind config
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (4 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 05/14] perf tools: Don't mix LIBUNWIND_LIBS into LIBUNWIND_LDFLAGS He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 07/14] perf tools: Rename unwind-libunwind.c to unwind-libunwind-local.c He Kuang
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

CONFIG_LIBUNWIND/NO_LIBUNWIND are changed to
CONFIG_LOCAL_LIBUNWIND/NO_LOCAL_LIBUNWIND for retaining local unwind
features. The new CONFIG_LIBUNWIND stands for either local or remote
or both unwind are supported, and NO_LIBUNWIND means that neither
local nor remote unwind is supported.

LIBUNWIND_LIBS is eliminated in LDFLAGS if local libunwind is not
supported.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/arch/arm/util/Build   |  2 +-
 tools/perf/arch/arm64/util/Build |  2 +-
 tools/perf/arch/x86/util/Build   |  2 +-
 tools/perf/config/Makefile       | 20 +++++++++++++++++---
 4 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/tools/perf/arch/arm/util/Build b/tools/perf/arch/arm/util/Build
index d22e3d0..f98da17 100644
--- a/tools/perf/arch/arm/util/Build
+++ b/tools/perf/arch/arm/util/Build
@@ -1,4 +1,4 @@
 libperf-$(CONFIG_DWARF) += dwarf-regs.o
 
-libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
+libperf-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind.o
 libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
index e58123a8..02f41db 100644
--- a/tools/perf/arch/arm64/util/Build
+++ b/tools/perf/arch/arm64/util/Build
@@ -1,2 +1,2 @@
 libperf-$(CONFIG_DWARF)     += dwarf-regs.o
-libperf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
+libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
diff --git a/tools/perf/arch/x86/util/Build b/tools/perf/arch/x86/util/Build
index 4659703..bc24b75 100644
--- a/tools/perf/arch/x86/util/Build
+++ b/tools/perf/arch/x86/util/Build
@@ -7,7 +7,7 @@ libperf-y += perf_regs.o
 libperf-$(CONFIG_DWARF) += dwarf-regs.o
 libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
 
-libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
+libperf-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind.o
 libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 
 libperf-$(CONFIG_AUXTRACE) += auxtrace.o
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 118df2d..3918687 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -353,10 +353,20 @@ ifeq ($(ARCH),powerpc)
 endif
 
 ifndef NO_LIBUNWIND
+  have_libunwind :=
   ifneq ($(feature-libunwind), 1)
     msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
+    NO_LOCAL_LIBUNWIND := 1
+  else
+    have_libunwind := 1
+    $(call detected,CONFIG_LOCAL_LIBUNWIND)
+  endif
+
+  ifneq ($(have_libunwind), 1)
     NO_LIBUNWIND := 1
   endif
+else
+  NO_LOCAL_LIBUNWIND := 1
 endif
 
 ifndef NO_LIBBPF
@@ -394,7 +404,7 @@ else
   NO_DWARF_UNWIND := 1
 endif
 
-ifndef NO_LIBUNWIND
+ifndef NO_LOCAL_LIBUNWIND
   ifeq ($(ARCH),$(filter $(ARCH),arm arm64))
     $(call feature_check,libunwind-debug-frame)
     ifneq ($(feature-libunwind-debug-frame), 1)
@@ -405,10 +415,14 @@ ifndef NO_LIBUNWIND
     # non-ARM has no dwarf_find_debug_frame() function:
     CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
   endif
-  CFLAGS  += -DHAVE_LIBUNWIND_SUPPORT
   EXTLIBS += $(LIBUNWIND_LIBS)
+  LDFLAGS += $(LIBUNWIND_LIBS)
+endif
+
+ifndef NO_LIBUNWIND
+  CFLAGS  += -DHAVE_LIBUNWIND_SUPPORT
   CFLAGS  += $(LIBUNWIND_CFLAGS)
-  LDFLAGS += $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
+  LDFLAGS += $(LIBUNWIND_LDFLAGS)
 endif
 
 ifndef NO_LIBAUDIT
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 07/14] perf tools: Rename unwind-libunwind.c to unwind-libunwind-local.c
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (5 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 06/14] perf tools: Separate local/remote libunwind config He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 08/14] perf tools: Extract common API out of unwind-libunwind-local.c He Kuang
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Since unwind-libunwind.c contains code for specific arithecture, we
change it's name to unwind-libunwind-local.c, and let it only be built
if local libunwind is supported.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/Build                                            | 2 +-
 tools/perf/util/{unwind-libunwind.c => unwind-libunwind-local.c} | 0
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename tools/perf/util/{unwind-libunwind.c => unwind-libunwind-local.c} (100%)

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 8c6c8a0..5e23d85 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -99,7 +99,7 @@ libperf-$(CONFIG_DWARF) += probe-finder.o
 libperf-$(CONFIG_DWARF) += dwarf-aux.o
 
 libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
-libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
+libperf-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind-local.o
 
 libperf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
 
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind-local.c
similarity index 100%
rename from tools/perf/util/unwind-libunwind.c
rename to tools/perf/util/unwind-libunwind-local.c
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 08/14] perf tools: Extract common API out of unwind-libunwind-local.c
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (6 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 07/14] perf tools: Rename unwind-libunwind.c to unwind-libunwind-local.c He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02 20:34   ` Jiri Olsa
  2016-06-02  9:55 ` [PATCH v8 09/14] perf tools: Export normalize_arch() function He Kuang
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

This patch extracts common unwind-libunwind APIs out of
unwind-libunwind-local.c, this part will be used by both local and
remote libunwind.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/Build                    |  1 +
 tools/perf/util/unwind-libunwind-local.c | 38 -----------------------------
 tools/perf/util/unwind-libunwind.c       | 42 ++++++++++++++++++++++++++++++++
 tools/perf/util/unwind.h                 |  2 --
 4 files changed, 43 insertions(+), 40 deletions(-)
 create mode 100644 tools/perf/util/unwind-libunwind.c

diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 5e23d85..004fb1d 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -100,6 +100,7 @@ libperf-$(CONFIG_DWARF) += dwarf-aux.o
 
 libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 libperf-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind-local.o
+libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
 
 libperf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
 
diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c
index e35c5bfda..9c70486 100644
--- a/tools/perf/util/unwind-libunwind-local.c
+++ b/tools/perf/util/unwind-libunwind-local.c
@@ -691,41 +691,3 @@ _unwind_libunwind_ops = {
 
 struct unwind_libunwind_ops *
 local_unwind_libunwind_ops = &_unwind_libunwind_ops;
-
-void unwind__register_ops(struct thread *thread,
-			  struct unwind_libunwind_ops *ops)
-{
-	thread->unwind_libunwind_ops = ops;
-}
-
-int unwind__prepare_access(struct thread *thread)
-{
-	unwind__register_ops(thread, local_unwind_libunwind_ops);
-
-	return thread->unwind_libunwind_ops->prepare_access(thread);
-}
-
-void unwind__flush_access(struct thread *thread)
-{
-	if (thread->unwind_libunwind_ops)
-		thread->unwind_libunwind_ops->flush_access(thread);
-}
-
-void unwind__finish_access(struct thread *thread)
-{
-	if (thread->unwind_libunwind_ops)
-		thread->unwind_libunwind_ops->finish_access(thread);
-}
-
-int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
-			 struct thread *thread,
-			 struct perf_sample *data, int max_stack)
-{
-	if (thread->unwind_libunwind_ops)
-		return thread->unwind_libunwind_ops->get_entries(cb, arg,
-								 thread,
-								 data,
-								 max_stack);
-	else
-		return 0;
-}
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
new file mode 100644
index 0000000..787adbb
--- /dev/null
+++ b/tools/perf/util/unwind-libunwind.c
@@ -0,0 +1,42 @@
+#include "unwind.h"
+#include "thread.h"
+
+struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops;
+
+void unwind__register_ops(struct thread *thread,
+			  struct unwind_libunwind_ops *ops)
+{
+	thread->unwind_libunwind_ops = ops;
+}
+
+int unwind__prepare_access(struct thread *thread)
+{
+	unwind__register_ops(thread, local_unwind_libunwind_ops);
+
+	return thread->unwind_libunwind_ops->prepare_access(thread);
+}
+
+void unwind__flush_access(struct thread *thread)
+{
+	if (thread->unwind_libunwind_ops)
+		thread->unwind_libunwind_ops->flush_access(thread);
+}
+
+void unwind__finish_access(struct thread *thread)
+{
+	if (thread->unwind_libunwind_ops)
+		thread->unwind_libunwind_ops->finish_access(thread);
+}
+
+int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
+			 struct thread *thread,
+			 struct perf_sample *data, int max_stack)
+{
+	if (thread->unwind_libunwind_ops)
+		return thread->unwind_libunwind_ops->get_entries(cb, arg,
+								 thread,
+								 data,
+								 max_stack);
+	else
+		return 0;
+}
diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h
index bd7377b..25001be 100644
--- a/tools/perf/util/unwind.h
+++ b/tools/perf/util/unwind.h
@@ -23,8 +23,6 @@ struct unwind_libunwind_ops {
 			   struct perf_sample *data, int max_stack);
 };
 
-struct unwind_libunwind_ops *local_unwind_libunwind_ops;
-
 #ifdef HAVE_DWARF_UNWIND_SUPPORT
 int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
 			struct thread *thread,
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 09/14] perf tools: Export normalize_arch() function
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (7 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 08/14] perf tools: Extract common API out of unwind-libunwind-local.c He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 10/14] perf tools: Check the target platform before assigning unwind methods He Kuang
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Export normalize_arch() function, so other part of perf can get
normalized form of arch string.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/arch/common.c | 2 +-
 tools/perf/arch/common.h | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/perf/arch/common.c b/tools/perf/arch/common.c
index e83c8ce..fa090a9 100644
--- a/tools/perf/arch/common.c
+++ b/tools/perf/arch/common.c
@@ -102,7 +102,7 @@ static int lookup_triplets(const char *const *triplets, const char *name)
  * Return architecture name in a normalized form.
  * The conversion logic comes from the Makefile.
  */
-static const char *normalize_arch(char *arch)
+const char *normalize_arch(char *arch)
 {
 	if (!strcmp(arch, "x86_64"))
 		return "x86";
diff --git a/tools/perf/arch/common.h b/tools/perf/arch/common.h
index 7529cfb..6b01c73 100644
--- a/tools/perf/arch/common.h
+++ b/tools/perf/arch/common.h
@@ -6,5 +6,6 @@
 extern const char *objdump_path;
 
 int perf_env__lookup_objdump(struct perf_env *env);
+const char *normalize_arch(char *arch);
 
 #endif /* ARCH_PERF_COMMON_H */
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 10/14] perf tools: Check the target platform before assigning unwind methods
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (8 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 09/14] perf tools: Export normalize_arch() function He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 11/14] perf tools: Change fixed name of libunwind__arch_reg_id to macro He Kuang
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Currently, perf script uses host unwind methods to parse perf.data
callchain info regardless of the target architecture. So we get wrong
result without any warnings when unwinding callchains of x86(32-bit)
on x86(64-bit) machine.

This patch adds extra step that check the target platform before
assigning unwind methods. In the latter patches in this series, we can
use this info to assign the right unwind methods for supported
platforms.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/thread.c           |  2 +-
 tools/perf/util/unwind-libunwind.c | 24 +++++++++++++++++++++++-
 tools/perf/util/unwind.h           |  5 +++--
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
index a33e76c..dfb3924 100644
--- a/tools/perf/util/thread.c
+++ b/tools/perf/util/thread.c
@@ -205,7 +205,7 @@ int thread__insert_map(struct thread *thread, struct map *map)
 	map_groups__fixup_overlappings(thread->mg, map, stderr);
 	map_groups__insert(thread->mg, map);
 
-	ret = unwind__prepare_access(thread);
+	ret = unwind__prepare_access(thread, map);
 	if (ret)
 		map_groups__remove(thread->mg, map);
 
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
index 787adbb..8e87884 100644
--- a/tools/perf/util/unwind-libunwind.c
+++ b/tools/perf/util/unwind-libunwind.c
@@ -1,5 +1,8 @@
 #include "unwind.h"
 #include "thread.h"
+#include "session.h"
+#include "debug.h"
+#include "arch/common.h"
 
 struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops;
 
@@ -9,8 +12,27 @@ void unwind__register_ops(struct thread *thread,
 	thread->unwind_libunwind_ops = ops;
 }
 
-int unwind__prepare_access(struct thread *thread)
+int unwind__prepare_access(struct thread *thread, struct map *map)
 {
+	const char *arch;
+	enum dso_type dso_type;
+
+	if (thread->addr_space) {
+		pr_debug("unwind: thread map already set, dso=%s\n",
+			 map->dso->name);
+		return 0;
+	}
+
+	if (!thread->mg->machine->env)
+		return 0;
+
+	dso_type = dso__type(map->dso, thread->mg->machine);
+	if (dso_type == DSO__TYPE_UNKNOWN)
+		return 0;
+
+	arch = normalize_arch(thread->mg->machine->env->arch);
+	pr_debug("unwind: target platform=%s\n", arch);
+
 	unwind__register_ops(thread, local_unwind_libunwind_ops);
 
 	return thread->unwind_libunwind_ops->prepare_access(thread);
diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h
index 25001be..dda2156 100644
--- a/tools/perf/util/unwind.h
+++ b/tools/perf/util/unwind.h
@@ -30,13 +30,14 @@ 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);
+int unwind__prepare_access(struct thread *thread, struct map *map);
 void unwind__flush_access(struct thread *thread);
 void unwind__finish_access(struct thread *thread);
 void unwind__register_ops(struct thread *thread,
 			  struct unwind_libunwind_ops *ops);
 #else
-static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
+static inline int unwind__prepare_access(struct thread *thread __maybe_unused,
+					 struct map *map __maybe_unused)
 {
 	return 0;
 }
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 11/14] perf tools: Change fixed name of libunwind__arch_reg_id to macro
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (9 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 10/14] perf tools: Check the target platform before assigning unwind methods He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 12/14] perf tools: Introduce flag to separate local/remote unwind compilation He Kuang
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

For local libunwind, it uses the fixed methods to convert register id
according to the host platform, but in remote libunwind, this convert
function should be the one for remote architecture. This patch changes
the fixed name to macro and code for each remote platform can be
compiled indivadually.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/unwind-libunwind-local.c | 2 +-
 tools/perf/util/unwind.h                 | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c
index 9c70486..631b40d 100644
--- a/tools/perf/util/unwind-libunwind-local.c
+++ b/tools/perf/util/unwind-libunwind-local.c
@@ -508,7 +508,7 @@ static int access_reg(unw_addr_space_t __maybe_unused as,
 		return 0;
 	}
 
-	id = libunwind__arch_reg_id(regnum);
+	id = LIBUNWIND__ARCH_REG_ID(regnum);
 	if (id < 0)
 		return -EINVAL;
 
diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h
index dda2156..a77b3dc 100644
--- a/tools/perf/util/unwind.h
+++ b/tools/perf/util/unwind.h
@@ -29,7 +29,10 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
 			struct perf_sample *data, int max_stack);
 /* libunwind specific */
 #ifdef HAVE_LIBUNWIND_SUPPORT
-int libunwind__arch_reg_id(int regnum);
+#ifndef LIBUNWIND__ARCH_REG_ID
+#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arch_reg_id(regnum)
+#endif
+int LIBUNWIND__ARCH_REG_ID(int regnum);
 int unwind__prepare_access(struct thread *thread, struct map *map);
 void unwind__flush_access(struct thread *thread);
 void unwind__finish_access(struct thread *thread);
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 12/14] perf tools: Introduce flag to separate local/remote unwind compilation
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (10 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 11/14] perf tools: Change fixed name of libunwind__arch_reg_id to macro He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02  9:55 ` [PATCH v8 13/14] perf callchain: Support x86 target platform He Kuang
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

This is a preparation for including unwind-libunwind-local.c in other
files for remote libunwind.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/util/unwind-libunwind-local.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c
index 631b40d..01c2e86 100644
--- a/tools/perf/util/unwind-libunwind-local.c
+++ b/tools/perf/util/unwind-libunwind-local.c
@@ -22,8 +22,10 @@
 #include <unistd.h>
 #include <sys/mman.h>
 #include <linux/list.h>
+#ifndef REMOTE_UNWIND_LIBUNWIND
 #include <libunwind.h>
 #include <libunwind-ptrace.h>
+#endif
 #include "callchain.h"
 #include "thread.h"
 #include "session.h"
@@ -689,5 +691,7 @@ _unwind_libunwind_ops = {
 	.get_entries    = _unwind__get_entries,
 };
 
+#ifndef REMOTE_UNWIND_LIBUNWIND
 struct unwind_libunwind_ops *
 local_unwind_libunwind_ops = &_unwind_libunwind_ops;
+#endif
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 13/14] perf callchain: Support x86 target platform
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (11 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 12/14] perf tools: Introduce flag to separate local/remote unwind compilation He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02 20:34   ` Jiri Olsa
  2016-06-02  9:55 ` [PATCH v8 14/14] perf callchain: Support aarch64 cross-platform He Kuang
  2016-06-02 20:35 ` [PATCH v8 00/14] Add support for remote unwind Jiri Olsa
  14 siblings, 1 reply; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Support x86(32-bit) cross platform callchain unwind.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/arch/x86/util/unwind-libunwind.c |  6 +++--
 tools/perf/config/Makefile                  |  8 +++++++
 tools/perf/util/Build                       |  1 +
 tools/perf/util/libunwind/x86_32.c          | 37 +++++++++++++++++++++++++++++
 tools/perf/util/unwind-libunwind.c          | 14 +++++++++--
 5 files changed, 62 insertions(+), 4 deletions(-)
 create mode 100644 tools/perf/util/libunwind/x86_32.c

diff --git a/tools/perf/arch/x86/util/unwind-libunwind.c b/tools/perf/arch/x86/util/unwind-libunwind.c
index db25e93..4f16661 100644
--- a/tools/perf/arch/x86/util/unwind-libunwind.c
+++ b/tools/perf/arch/x86/util/unwind-libunwind.c
@@ -1,12 +1,14 @@
 
+#ifndef REMOTE_UNWIND_LIBUNWIND
 #include <errno.h>
 #include <libunwind.h>
 #include "perf_regs.h"
 #include "../../util/unwind.h"
 #include "../../util/debug.h"
+#endif
 
 #ifdef HAVE_ARCH_X86_64_SUPPORT
-int libunwind__arch_reg_id(int regnum)
+int LIBUNWIND__ARCH_REG_ID(int regnum)
 {
 	int id;
 
@@ -70,7 +72,7 @@ int libunwind__arch_reg_id(int regnum)
 	return id;
 }
 #else
-int libunwind__arch_reg_id(int regnum)
+int LIBUNWIND__ARCH_REG_ID(int regnum)
 {
 	int id;
 
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 3918687..34999fb 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -354,6 +354,14 @@ endif
 
 ifndef NO_LIBUNWIND
   have_libunwind :=
+
+  ifeq ($(feature-libunwind-x86), 1)
+    $(call detected,CONFIG_LIBUNWIND_X86)
+    CFLAGS += -DHAVE_LIBUNWIND_X86_SUPPORT
+    LDFLAGS += -lunwind-x86
+    have_libunwind = 1
+  endif
+
   ifneq ($(feature-libunwind), 1)
     msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
     NO_LOCAL_LIBUNWIND := 1
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 004fb1d..7746e09 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -101,6 +101,7 @@ libperf-$(CONFIG_DWARF) += dwarf-aux.o
 libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 libperf-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind-local.o
 libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
+libperf-$(CONFIG_LIBUNWIND_X86)      += libunwind/x86_32.o
 
 libperf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
 
diff --git a/tools/perf/util/libunwind/x86_32.c b/tools/perf/util/libunwind/x86_32.c
new file mode 100644
index 0000000..d98c17e
--- /dev/null
+++ b/tools/perf/util/libunwind/x86_32.c
@@ -0,0 +1,37 @@
+/*
+ * This file setups defines to compile arch specific binary from the
+ * generic one.
+ *
+ * The function 'LIBUNWIND__ARCH_REG_ID' name is set according to arch
+ * name and the defination of this function is included directly from
+ * 'arch/x86/util/unwind-libunwind.c', to make sure that this function
+ * is defined no matter what arch the host is.
+ *
+ * Finally, the arch specific unwind methods are exported which will
+ * be assigned to each x86 thread.
+ */
+
+#define REMOTE_UNWIND_LIBUNWIND
+#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__x86_reg_id(regnum)
+
+#include "unwind.h"
+#include "debug.h"
+#include "libunwind-x86.h"
+#include <../../../../arch/x86/include/uapi/asm/perf_regs.h>
+
+/* HAVE_ARCH_X86_64_SUPPORT is used in'arch/x86/util/unwind-libunwind.c'
+ * for x86_32, we undef it to compile code for x86_32 only.
+ */
+#undef HAVE_ARCH_X86_64_SUPPORT
+#include "../../arch/x86/util/unwind-libunwind.c"
+
+/* Explicitly define NO_LIBUNWIND_DEBUG_FRAME, because non-ARM has no
+ * dwarf_find_debug_frame() function.
+ */
+#ifndef NO_LIBUNWIND_DEBUG_FRAME
+#define NO_LIBUNWIND_DEBUG_FRAME
+#endif
+#include "util/unwind-libunwind-local.c"
+
+struct unwind_libunwind_ops *
+x86_32_unwind_libunwind_ops = &_unwind_libunwind_ops;
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
index 8e87884..28f8a4d 100644
--- a/tools/perf/util/unwind-libunwind.c
+++ b/tools/perf/util/unwind-libunwind.c
@@ -5,6 +5,7 @@
 #include "arch/common.h"
 
 struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops;
+struct unwind_libunwind_ops __weak *x86_32_unwind_libunwind_ops;
 
 void unwind__register_ops(struct thread *thread,
 			  struct unwind_libunwind_ops *ops)
@@ -16,6 +17,7 @@ int unwind__prepare_access(struct thread *thread, struct map *map)
 {
 	const char *arch;
 	enum dso_type dso_type;
+	struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops;
 
 	if (thread->addr_space) {
 		pr_debug("unwind: thread map already set, dso=%s\n",
@@ -31,9 +33,17 @@ int unwind__prepare_access(struct thread *thread, struct map *map)
 		return 0;
 
 	arch = normalize_arch(thread->mg->machine->env->arch);
-	pr_debug("unwind: target platform=%s\n", arch);
 
-	unwind__register_ops(thread, local_unwind_libunwind_ops);
+	if (!strcmp(arch, "x86"))
+		if (dso_type != DSO__TYPE_64BIT)
+			ops = x86_32_unwind_libunwind_ops;
+
+	if (!ops) {
+		pr_err("unwind: target platform=%s is not supported\n", arch);
+		return -1;
+	}
+
+	unwind__register_ops(thread, ops);
 
 	return thread->unwind_libunwind_ops->prepare_access(thread);
 }
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v8 14/14] perf callchain: Support aarch64 cross-platform
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (12 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 13/14] perf callchain: Support x86 target platform He Kuang
@ 2016-06-02  9:55 ` He Kuang
  2016-06-02 20:35 ` [PATCH v8 00/14] Add support for remote unwind Jiri Olsa
  14 siblings, 0 replies; 20+ messages in thread
From: He Kuang @ 2016-06-02  9:55 UTC (permalink / raw)
  To: peterz, mingo, acme, alexander.shishkin, jolsa, wangnan0,
	hekuang, jpoimboe, ak, eranian, namhyung, adrian.hunter, sukadev,
	masami.hiramatsu.pt, tumanova, kan.liang, penberg, dsahern
  Cc: linux-kernel

Support aarch64 cross platform callchain unwind.

Signed-off-by: He Kuang <hekuang@huawei.com>
---
 tools/perf/arch/arm64/util/unwind-libunwind.c |  4 ++-
 tools/perf/config/Makefile                    | 12 +++++++++
 tools/perf/util/Build                         |  1 +
 tools/perf/util/libunwind/arm64.c             | 35 +++++++++++++++++++++++++++
 tools/perf/util/unwind-libunwind.c            |  7 +++++-
 5 files changed, 57 insertions(+), 2 deletions(-)
 create mode 100644 tools/perf/util/libunwind/arm64.c

diff --git a/tools/perf/arch/arm64/util/unwind-libunwind.c b/tools/perf/arch/arm64/util/unwind-libunwind.c
index a87afa9..c116b71 100644
--- a/tools/perf/arch/arm64/util/unwind-libunwind.c
+++ b/tools/perf/arch/arm64/util/unwind-libunwind.c
@@ -1,11 +1,13 @@
 
+#ifndef REMOTE_UNWIND_LIBUNWIND
 #include <errno.h>
 #include <libunwind.h>
 #include "perf_regs.h"
 #include "../../util/unwind.h"
 #include "../../util/debug.h"
+#endif
 
-int libunwind__arch_reg_id(int regnum)
+int LIBUNWIND__ARCH_REG_ID(int regnum)
 {
 	switch (regnum) {
 	case UNW_AARCH64_X0:
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 34999fb..47e8f58 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -362,6 +362,18 @@ ifndef NO_LIBUNWIND
     have_libunwind = 1
   endif
 
+  ifeq ($(feature-libunwind-aarch64), 1)
+    $(call detected,CONFIG_LIBUNWIND_AARCH64)
+    CFLAGS += -DHAVE_LIBUNWIND_AARCH64_SUPPORT
+    LDFLAGS += -lunwind-aarch64
+    have_libunwind = 1
+    $(call feature_check,libunwind-debug-frame-aarch64)
+    ifneq ($(feature-libunwind-debug-frame-aarch64), 1)
+      msg := $(warning No debug_frame support found in libunwind-aarch64);
+      CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME_AARCH64
+    endif
+  endif
+
   ifneq ($(feature-libunwind), 1)
     msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
     NO_LOCAL_LIBUNWIND := 1
diff --git a/tools/perf/util/Build b/tools/perf/util/Build
index 7746e09..fced833 100644
--- a/tools/perf/util/Build
+++ b/tools/perf/util/Build
@@ -102,6 +102,7 @@ libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
 libperf-$(CONFIG_LOCAL_LIBUNWIND)    += unwind-libunwind-local.o
 libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind.o
 libperf-$(CONFIG_LIBUNWIND_X86)      += libunwind/x86_32.o
+libperf-$(CONFIG_LIBUNWIND_AARCH64)  += libunwind/arm64.o
 
 libperf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
 
diff --git a/tools/perf/util/libunwind/arm64.c b/tools/perf/util/libunwind/arm64.c
new file mode 100644
index 0000000..4fb5395
--- /dev/null
+++ b/tools/perf/util/libunwind/arm64.c
@@ -0,0 +1,35 @@
+/*
+ * This file setups defines to compile arch specific binary from the
+ * generic one.
+ *
+ * The function 'LIBUNWIND__ARCH_REG_ID' name is set according to arch
+ * name and the defination of this function is included directly from
+ * 'arch/arm64/util/unwind-libunwind.c', to make sure that this function
+ * is defined no matter what arch the host is.
+ *
+ * Finally, the arch specific unwind methods are exported which will
+ * be assigned to each arm64 thread.
+ */
+
+#define REMOTE_UNWIND_LIBUNWIND
+
+#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arm64_reg_id(regnum)
+
+#include "unwind.h"
+#include "debug.h"
+#include "libunwind-aarch64.h"
+#include <../../../../arch/arm64/include/uapi/asm/perf_regs.h>
+#include "../../arch/arm64/util/unwind-libunwind.c"
+
+/* NO_LIBUNWIND_DEBUG_FRAME is a feature flag for local libunwind,
+ * assign NO_LIBUNWIND_DEBUG_FRAME_AARCH64 to it for compiling arm64
+ * unwind methods.
+ */
+#undef NO_LIBUNWIND_DEBUG_FRAME
+#ifdef NO_LIBUNWIND_DEBUG_FRAME_AARCH64
+#define NO_LIBUNWIND_DEBUG_FRAME
+#endif
+#include "util/unwind-libunwind-local.c"
+
+struct unwind_libunwind_ops *
+arm64_unwind_libunwind_ops = &_unwind_libunwind_ops;
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c
index 28f8a4d..8b2882c 100644
--- a/tools/perf/util/unwind-libunwind.c
+++ b/tools/perf/util/unwind-libunwind.c
@@ -6,6 +6,7 @@
 
 struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops;
 struct unwind_libunwind_ops __weak *x86_32_unwind_libunwind_ops;
+struct unwind_libunwind_ops __weak *arm64_unwind_libunwind_ops;
 
 void unwind__register_ops(struct thread *thread,
 			  struct unwind_libunwind_ops *ops)
@@ -34,9 +35,13 @@ int unwind__prepare_access(struct thread *thread, struct map *map)
 
 	arch = normalize_arch(thread->mg->machine->env->arch);
 
-	if (!strcmp(arch, "x86"))
+	if (!strcmp(arch, "x86")) {
 		if (dso_type != DSO__TYPE_64BIT)
 			ops = x86_32_unwind_libunwind_ops;
+	} else if (!strcmp(arch, "arm64") || !strcmp(arch, "arm")) {
+		if (dso_type == DSO__TYPE_64BIT)
+			ops = arm64_unwind_libunwind_ops;
+	}
 
 	if (!ops) {
 		pr_err("unwind: target platform=%s is not supported\n", arch);
-- 
1.8.5.2

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH v8 04/14] perf tools: Move unwind__prepare_access from thread_new into thread__insert_map
  2016-06-02  9:55 ` [PATCH v8 04/14] perf tools: Move unwind__prepare_access from thread_new into thread__insert_map He Kuang
@ 2016-06-02 20:33   ` Jiri Olsa
  0 siblings, 0 replies; 20+ messages in thread
From: Jiri Olsa @ 2016-06-02 20:33 UTC (permalink / raw)
  To: He Kuang
  Cc: peterz, mingo, acme, alexander.shishkin, wangnan0, jpoimboe, ak,
	eranian, namhyung, adrian.hunter, sukadev, masami.hiramatsu.pt,
	tumanova, kan.liang, penberg, dsahern, linux-kernel

On Thu, Jun 02, 2016 at 09:55:16AM +0000, He Kuang wrote:

SNIP

>  }
>  
> -void thread__insert_map(struct thread *thread, struct map *map)
> +int thread__insert_map(struct thread *thread, struct map *map)
>  {
> +	int ret;
> +
>  	map_groups__fixup_overlappings(thread->mg, map, stderr);
>  	map_groups__insert(thread->mg, map);
> +
> +	ret = unwind__prepare_access(thread);
> +	if (ret)
> +		map_groups__remove(thread->mg, map);

we could move this call to the top and sve the call to map_groups__remove

jirka

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v8 13/14] perf callchain: Support x86 target platform
  2016-06-02  9:55 ` [PATCH v8 13/14] perf callchain: Support x86 target platform He Kuang
@ 2016-06-02 20:34   ` Jiri Olsa
  0 siblings, 0 replies; 20+ messages in thread
From: Jiri Olsa @ 2016-06-02 20:34 UTC (permalink / raw)
  To: He Kuang
  Cc: peterz, mingo, acme, alexander.shishkin, wangnan0, jpoimboe, ak,
	eranian, namhyung, adrian.hunter, sukadev, masami.hiramatsu.pt,
	tumanova, kan.liang, penberg, dsahern, linux-kernel

On Thu, Jun 02, 2016 at 09:55:25AM +0000, He Kuang wrote:

SNIP

> @@ -31,9 +33,17 @@ int unwind__prepare_access(struct thread *thread, struct map *map)
>  		return 0;
>  
>  	arch = normalize_arch(thread->mg->machine->env->arch);
> -	pr_debug("unwind: target platform=%s\n", arch);
>  
> -	unwind__register_ops(thread, local_unwind_libunwind_ops);
> +	if (!strcmp(arch, "x86"))
> +		if (dso_type != DSO__TYPE_64BIT)
> +			ops = x86_32_unwind_libunwind_ops;

pleas enclose above into { }

thanks,
jirka

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v8 08/14] perf tools: Extract common API out of unwind-libunwind-local.c
  2016-06-02  9:55 ` [PATCH v8 08/14] perf tools: Extract common API out of unwind-libunwind-local.c He Kuang
@ 2016-06-02 20:34   ` Jiri Olsa
  0 siblings, 0 replies; 20+ messages in thread
From: Jiri Olsa @ 2016-06-02 20:34 UTC (permalink / raw)
  To: He Kuang
  Cc: peterz, mingo, acme, alexander.shishkin, wangnan0, jpoimboe, ak,
	eranian, namhyung, adrian.hunter, sukadev, masami.hiramatsu.pt,
	tumanova, kan.liang, penberg, dsahern, linux-kernel

On Thu, Jun 02, 2016 at 09:55:20AM +0000, He Kuang wrote:

SNIP

> +void unwind__finish_access(struct thread *thread)
> +{
> +	if (thread->unwind_libunwind_ops)
> +		thread->unwind_libunwind_ops->finish_access(thread);
> +}
> +
> +int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
> +			 struct thread *thread,
> +			 struct perf_sample *data, int max_stack)
> +{
> +	if (thread->unwind_libunwind_ops)
> +		return thread->unwind_libunwind_ops->get_entries(cb, arg,
> +								 thread,
> +								 data,
> +								 max_stack);

please enclose both if and else paths into { }
there's a rule to do that for multiple line paths

thanks,
jirka

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v8 03/14] perf tools: Introducing struct unwind_libunwind_ops for local unwind
  2016-06-02  9:55 ` [PATCH v8 03/14] perf tools: Introducing struct unwind_libunwind_ops for local unwind He Kuang
@ 2016-06-02 20:34   ` Jiri Olsa
  0 siblings, 0 replies; 20+ messages in thread
From: Jiri Olsa @ 2016-06-02 20:34 UTC (permalink / raw)
  To: He Kuang
  Cc: peterz, mingo, acme, alexander.shishkin, wangnan0, jpoimboe, ak,
	eranian, namhyung, adrian.hunter, sukadev, masami.hiramatsu.pt,
	tumanova, kan.liang, penberg, dsahern, linux-kernel

On Thu, Jun 02, 2016 at 09:55:15AM +0000, He Kuang wrote:

SNIP

> @@ -680,3 +680,52 @@ int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
>  
>  	return get_entries(&ui, cb, arg, max_stack);
>  }
> +
> +static struct unwind_libunwind_ops
> +_unwind_libunwind_ops = {
> +	.prepare_access = _unwind__prepare_access,
> +	.flush_access   = _unwind__flush_access,
> +	.finish_access  = _unwind__finish_access,
> +	.get_entries    = _unwind__get_entries,
> +};
> +
> +struct unwind_libunwind_ops *
> +local_unwind_libunwind_ops = &_unwind_libunwind_ops;
> +
> +void unwind__register_ops(struct thread *thread,
> +			  struct unwind_libunwind_ops *ops)
> +{
> +	thread->unwind_libunwind_ops = ops;
> +}

no need for unwind__register_ops to be global
please make it static

jirka

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v8 00/14] Add support for remote unwind
  2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
                   ` (13 preceding siblings ...)
  2016-06-02  9:55 ` [PATCH v8 14/14] perf callchain: Support aarch64 cross-platform He Kuang
@ 2016-06-02 20:35 ` Jiri Olsa
  14 siblings, 0 replies; 20+ messages in thread
From: Jiri Olsa @ 2016-06-02 20:35 UTC (permalink / raw)
  To: He Kuang
  Cc: peterz, mingo, acme, alexander.shishkin, wangnan0, jpoimboe, ak,
	eranian, namhyung, adrian.hunter, sukadev, masami.hiramatsu.pt,
	tumanova, kan.liang, penberg, dsahern, linux-kernel

On Thu, Jun 02, 2016 at 09:55:12AM +0000, He Kuang wrote:

SNIP

> and now we can use LIBUNWIND_DIR to specific custom dirctories
> containing libunwind libs.
> 
> v8:
> 
>  - Put unwind__register_ops call into unwind__prepare_access from
>    patch 4 to patch 3.
>  - Fail thread__insert_map on error.
>  - Remove unused macro HAVE_LIBUNWIND_LOCAL_SUPPORT.
>  - Return once find that thread->addr_space is valid and check this
>    value first.
>  - Add comments in file 'util/libunwind/arm64.c',
>    'util/libunwind/x86_32.c', and explain the reason for debug-frame
>    flag in non-arm arch.

apart from few nitpicks, this looks ok to me

I tried with 32bit unwind under 64bits and it works nicely,
plus 64bit unwind seems not to be broken as well ;-)

considerring those nitpicks solved:

Acked-by: Jiri Olsa <jolsa@kernel.org>


thanks,
jirka

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2016-06-02 20:35 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-02  9:55 [PATCH v8 00/14] Add support for remote unwind He Kuang
2016-06-02  9:55 ` [PATCH v8 01/14] perf tools: Use LIBUNWIND_DIR for remote libunwind feature check He Kuang
2016-06-02  9:55 ` [PATCH v8 02/14] perf tools: Decouple thread->address_space on libunwind He Kuang
2016-06-02  9:55 ` [PATCH v8 03/14] perf tools: Introducing struct unwind_libunwind_ops for local unwind He Kuang
2016-06-02 20:34   ` Jiri Olsa
2016-06-02  9:55 ` [PATCH v8 04/14] perf tools: Move unwind__prepare_access from thread_new into thread__insert_map He Kuang
2016-06-02 20:33   ` Jiri Olsa
2016-06-02  9:55 ` [PATCH v8 05/14] perf tools: Don't mix LIBUNWIND_LIBS into LIBUNWIND_LDFLAGS He Kuang
2016-06-02  9:55 ` [PATCH v8 06/14] perf tools: Separate local/remote libunwind config He Kuang
2016-06-02  9:55 ` [PATCH v8 07/14] perf tools: Rename unwind-libunwind.c to unwind-libunwind-local.c He Kuang
2016-06-02  9:55 ` [PATCH v8 08/14] perf tools: Extract common API out of unwind-libunwind-local.c He Kuang
2016-06-02 20:34   ` Jiri Olsa
2016-06-02  9:55 ` [PATCH v8 09/14] perf tools: Export normalize_arch() function He Kuang
2016-06-02  9:55 ` [PATCH v8 10/14] perf tools: Check the target platform before assigning unwind methods He Kuang
2016-06-02  9:55 ` [PATCH v8 11/14] perf tools: Change fixed name of libunwind__arch_reg_id to macro He Kuang
2016-06-02  9:55 ` [PATCH v8 12/14] perf tools: Introduce flag to separate local/remote unwind compilation He Kuang
2016-06-02  9:55 ` [PATCH v8 13/14] perf callchain: Support x86 target platform He Kuang
2016-06-02 20:34   ` Jiri Olsa
2016-06-02  9:55 ` [PATCH v8 14/14] perf callchain: Support aarch64 cross-platform He Kuang
2016-06-02 20:35 ` [PATCH v8 00/14] Add support for remote unwind Jiri Olsa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).