Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1412751 > unrolled thread

[PATCH v9 00/14] Add support for remote unwind

Started byHe Kuang <hekuang@huawei.com>
First post2016-06-03 05:40 +0200
Last post2016-06-08 09:40 +0200
Articles 20 — 5 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v9 00/14] Add support for remote unwind He Kuang <hekuang@huawei.com> - 2016-06-03 05:40 +0200
    [PATCH v9 14/14] perf callchain: Support aarch64 cross-platform He Kuang <hekuang@huawei.com> - 2016-06-03 05:40 +0200
      [tip:perf/core] perf callchain: Support aarch64 cross-platform tip-bot for He Kuang <tipbot@zytor.com> - 2016-06-08 11:00 +0200
    [PATCH v9 06/14] perf tools: Separate local/remote libunwind config He Kuang <hekuang@huawei.com> - 2016-06-03 05:40 +0200
      [tip:perf/core] perf unwind: Separate local/remote libunwind config tip-bot for He Kuang <tipbot@zytor.com> - 2016-06-08 10:50 +0200
    [PATCH v9 11/14] perf tools: Change fixed name of libunwind__arch_reg_id to macro He Kuang <hekuang@huawei.com> - 2016-06-03 05:40 +0200
      [tip:perf/core] perf unwind: Change fixed name of  libunwind__arch_reg_id to macro tip-bot for He Kuang <tipbot@zytor.com> - 2016-06-08 11:00 +0200
    [PATCH v9 09/14] perf tools: Export normalize_arch() function He Kuang <hekuang@huawei.com> - 2016-06-03 05:40 +0200
      [tip:perf/core] perf tools: Export normalize_arch() function tip-bot for He Kuang <tipbot@zytor.com> - 2016-06-08 11:00 +0200
    [PATCH v9 02/14] perf tools: Decouple thread->address_space on libunwind He Kuang <hekuang@huawei.com> - 2016-06-03 05:40 +0200
      [tip:perf/core] perf unwind: Decouple thread->address_space on  libunwind tip-bot for He Kuang <tipbot@zytor.com> - 2016-06-08 10:50 +0200
    Re: [PATCH v9 00/14] Add support for remote unwind Jiri Olsa <jolsa@redhat.com> - 2016-06-03 09:10 +0200
      Re: [PATCH v9 00/14] Add support for remote unwind Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-03 21:50 +0200
        Re: [PATCH v9 00/14] Add support for remote unwind Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-03 23:10 +0200
          Re: [PATCH v9 00/14] Add support for remote unwind Hekuang <hekuang@huawei.com> - 2016-06-04 07:50 +0200
            Re: [PATCH v9 00/14] Add support for remote unwind Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-07 17:20 +0200
            Re: [PATCH v9 00/14] Add support for remote unwind Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-07 17:20 +0200
        Re: [PATCH v9 00/14] Add support for remote unwind Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-03 23:10 +0200
      Re: [PATCH v9 00/14] Add support for remote unwind Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-06-07 21:50 +0200
        Re: [PATCH v9 00/14] Add support for remote unwind Hekuang <hekuang@huawei.com> - 2016-06-08 09:40 +0200

#1412751 — [PATCH v9 00/14] Add support for remote unwind

FromHe Kuang <hekuang@huawei.com>
Date2016-06-03 05:40 +0200
Subject[PATCH v9 00/14] Add support for remote unwind
Message-ID<rFO7L-6nc-9@gated-at.bofh.it>
v8 url:
  http://thread.gmane.org/gmane.linux.kernel/2233232

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.

Acked-by: Jiri Olsa <jolsa@kernel.org> for most patches except:

v9:
 - Change function unwind__register_ops() to static.
 - Move up unwind__prepare_access() in thread__insert_map() and save
   map_groups__remove() call.
 - Enclose multiple line if/else into braces.
 - Fix miss modified function declaration for unwind__prepare_access()
   in patch 10.

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            | 692 ++-----------------------
 tools/perf/util/unwind.h                      |  22 +-
 17 files changed, 919 insertions(+), 674 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

[toc] | [next] | [standalone]


#1412752 — [PATCH v9 14/14] perf callchain: Support aarch64 cross-platform

FromHe Kuang <hekuang@huawei.com>
Date2016-06-03 05:40 +0200
Subject[PATCH v9 14/14] perf callchain: Support aarch64 cross-platform
Message-ID<rFO7M-6nc-29@gated-at.bofh.it>
In reply to#1412751
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            |  4 +++
 5 files changed, 55 insertions(+), 1 deletion(-)
 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 c4d6388..2c3ec8c 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;
 
 static void unwind__register_ops(struct thread *thread,
 			  struct unwind_libunwind_ops *ops)
@@ -37,6 +38,9 @@ int unwind__prepare_access(struct thread *thread, struct map *map)
 	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) {
-- 
1.8.5.2

[toc] | [prev] | [next] | [standalone]


#1417099 — [tip:perf/core] perf callchain: Support aarch64 cross-platform

Fromtip-bot for He Kuang <tipbot@zytor.com>
Date2016-06-08 11:00 +0200
Subject[tip:perf/core] perf callchain: Support aarch64 cross-platform
Message-ID<rHHvc-6mU-21@gated-at.bofh.it>
In reply to#1412752
Commit-ID:  057fbfb25cde4a368418f3f720cdc31d48800c4d
Gitweb:     http://git.kernel.org/tip/057fbfb25cde4a368418f3f720cdc31d48800c4d
Author:     He Kuang <hekuang@huawei.com>
AuthorDate: Fri, 3 Jun 2016 03:33:23 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 7 Jun 2016 15:13:35 -0300

perf callchain: Support aarch64 cross-platform

Support aarch64 cross platform callchain unwind.

Signed-off-by: He Kuang <hekuang@huawei.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1464924803-22214-15-git-send-email-hekuang@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.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            |  4 +++
 5 files changed, 55 insertions(+), 1 deletion(-)

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 e65515a..8547119 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;
 
 static void unwind__register_ops(struct thread *thread,
 			  struct unwind_libunwind_ops *ops)
@@ -38,6 +39,9 @@ int unwind__prepare_access(struct thread *thread, struct map *map)
 	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) {

[toc] | [prev] | [next] | [standalone]


#1412753 — [PATCH v9 06/14] perf tools: Separate local/remote libunwind config

FromHe Kuang <hekuang@huawei.com>
Date2016-06-03 05:40 +0200
Subject[PATCH v9 06/14] perf tools: Separate local/remote libunwind config
Message-ID<rFO7M-6nc-35@gated-at.bofh.it>
In reply to#1412751
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

[toc] | [prev] | [next] | [standalone]


#1417089 — [tip:perf/core] perf unwind: Separate local/remote libunwind config

Fromtip-bot for He Kuang <tipbot@zytor.com>
Date2016-06-08 10:50 +0200
Subject[tip:perf/core] perf unwind: Separate local/remote libunwind config
Message-ID<rHHlw-6ig-51@gated-at.bofh.it>
In reply to#1412753
Commit-ID:  9d8e14d306ef2f5daf2fd099ef07c39dd83e2c0d
Gitweb:     http://git.kernel.org/tip/9d8e14d306ef2f5daf2fd099ef07c39dd83e2c0d
Author:     He Kuang <hekuang@huawei.com>
AuthorDate: Fri, 3 Jun 2016 03:33:15 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 7 Jun 2016 12:08:52 -0300

perf unwind: Separate local/remote libunwind config

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>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1464924803-22214-7-git-send-email-hekuang@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.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 4cd8a16..f95e6f4 100644
--- a/tools/perf/arch/x86/util/Build
+++ b/tools/perf/arch/x86/util/Build
@@ -8,7 +8,7 @@ libperf-y += group.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

[toc] | [prev] | [next] | [standalone]


#1412754 — [PATCH v9 11/14] perf tools: Change fixed name of libunwind__arch_reg_id to macro

FromHe Kuang <hekuang@huawei.com>
Date2016-06-03 05:40 +0200
Subject[PATCH v9 11/14] perf tools: Change fixed name of libunwind__arch_reg_id to macro
Message-ID<rFO7M-6nc-37@gated-at.bofh.it>
In reply to#1412751
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 bf9f593..b074662 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

[toc] | [prev] | [next] | [standalone]


#1417101 — [tip:perf/core] perf unwind: Change fixed name of libunwind__arch_reg_id to macro

Fromtip-bot for He Kuang <tipbot@zytor.com>
Date2016-06-08 11:00 +0200
Subject[tip:perf/core] perf unwind: Change fixed name of libunwind__arch_reg_id to macro
Message-ID<rHHvc-6mU-23@gated-at.bofh.it>
In reply to#1412754
Commit-ID:  eeb118c5d77878948e09308afe4fd9d0efe68ef7
Gitweb:     http://git.kernel.org/tip/eeb118c5d77878948e09308afe4fd9d0efe68ef7
Author:     He Kuang <hekuang@huawei.com>
AuthorDate: Fri, 3 Jun 2016 03:33:20 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 7 Jun 2016 15:11:46 -0300

perf unwind: Change fixed name of libunwind__arch_reg_id to macro

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>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1464924803-22214-12-git-send-email-hekuang@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.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 bf9f593..b074662 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);

[toc] | [prev] | [next] | [standalone]


#1412757 — [PATCH v9 09/14] perf tools: Export normalize_arch() function

FromHe Kuang <hekuang@huawei.com>
Date2016-06-03 05:40 +0200
Subject[PATCH v9 09/14] perf tools: Export normalize_arch() function
Message-ID<rFO7M-6nc-41@gated-at.bofh.it>
In reply to#1412751
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

[toc] | [prev] | [next] | [standalone]


#1417103 — [tip:perf/core] perf tools: Export normalize_arch() function

Fromtip-bot for He Kuang <tipbot@zytor.com>
Date2016-06-08 11:00 +0200
Subject[tip:perf/core] perf tools: Export normalize_arch() function
Message-ID<rHHvc-6mU-29@gated-at.bofh.it>
In reply to#1412757
Commit-ID:  940e6987fcfb6092cda8f2f87f2937c55fa038c4
Gitweb:     http://git.kernel.org/tip/940e6987fcfb6092cda8f2f87f2937c55fa038c4
Author:     He Kuang <hekuang@huawei.com>
AuthorDate: Fri, 3 Jun 2016 03:33:18 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 7 Jun 2016 12:08:53 -0300

perf tools: Export normalize_arch() function

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

Signed-off-by: He Kuang <hekuang@huawei.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1464924803-22214-10-git-send-email-hekuang@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.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 */

[toc] | [prev] | [next] | [standalone]


#1412758 — [PATCH v9 02/14] perf tools: Decouple thread->address_space on libunwind

FromHe Kuang <hekuang@huawei.com>
Date2016-06-03 05:40 +0200
Subject[PATCH v9 02/14] perf tools: Decouple thread->address_space on libunwind
Message-ID<rFO7M-6nc-43@gated-at.bofh.it>
In reply to#1412751
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

[toc] | [prev] | [next] | [standalone]


#1417079 — [tip:perf/core] perf unwind: Decouple thread->address_space on libunwind

Fromtip-bot for He Kuang <tipbot@zytor.com>
Date2016-06-08 10:50 +0200
Subject[tip:perf/core] perf unwind: Decouple thread->address_space on libunwind
Message-ID<rHHlw-6ig-29@gated-at.bofh.it>
In reply to#1412758
Commit-ID:  c1d1d0d9b302cb5f0365f4de78dd7fcbf7983c05
Gitweb:     http://git.kernel.org/tip/c1d1d0d9b302cb5f0365f4de78dd7fcbf7983c05
Author:     He Kuang <hekuang@huawei.com>
AuthorDate: Fri, 3 Jun 2016 03:33:11 +0000
Committer:  Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 7 Jun 2016 12:08:51 -0300

perf unwind: Decouple thread->address_space on libunwind

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>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1464924803-22214-3-git-send-email-hekuang@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.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 08fcb14..4c9f0aa 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
 };
 

[toc] | [prev] | [next] | [standalone]


#1412851

FromJiri Olsa <jolsa@redhat.com>
Date2016-06-03 09:10 +0200
Message-ID<rFRoZ-69-1@gated-at.bofh.it>
In reply to#1412751
On Fri, Jun 03, 2016 at 03:33:09AM +0000, He Kuang wrote:

SNIP

> 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.
> 
> Acked-by: Jiri Olsa <jolsa@kernel.org> for most patches except:
> 
> v9:
>  - Change function unwind__register_ops() to static.
>  - Move up unwind__prepare_access() in thread__insert_map() and save
>    map_groups__remove() call.
>  - Enclose multiple line if/else into braces.
>  - Fix miss modified function declaration for unwind__prepare_access()
>    in patch 10.

for patchset:

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

thanks,
jirka

[toc] | [prev] | [next] | [standalone]


#1413423

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-06-03 21:50 +0200
Message-ID<rG3gu-7rr-13@gated-at.bofh.it>
In reply to#1412851
Em Fri, Jun 03, 2016 at 09:06:29AM +0200, Jiri Olsa escreveu:
> On Fri, Jun 03, 2016 at 03:33:09AM +0000, He Kuang wrote:
> > v9:
> >  - Change function unwind__register_ops() to static.
> >  - Move up unwind__prepare_access() in thread__insert_map() and save
> >    map_groups__remove() call.
> >  - Enclose multiple line if/else into braces.
> >  - Fix miss modified function declaration for unwind__prepare_access()
> >    in patch 10.
 
> for patchset:
 
> Acked-by: Jiri Olsa <jolsa@kernel.org>

Thanks, applied, build testing.

- Arnaldo

[toc] | [prev] | [next] | [standalone]


#1413483

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-06-03 23:10 +0200
Message-ID<rG4vT-8lx-21@gated-at.bofh.it>
In reply to#1413423
Em Fri, Jun 03, 2016 at 06:06:02PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Fri, Jun 03, 2016 at 04:42:05PM -0300, Arnaldo Carvalho de Melo escreveu:
> > Em Fri, Jun 03, 2016 at 09:06:29AM +0200, Jiri Olsa escreveu:
> > > On Fri, Jun 03, 2016 at 03:33:09AM +0000, He Kuang wrote:
> > > > v9:
> > > >  - Change function unwind__register_ops() to static.
> > > >  - Move up unwind__prepare_access() in thread__insert_map() and save
> > > >    map_groups__remove() call.
> > > >  - Enclose multiple line if/else into braces.
> > > >  - Fix miss modified function declaration for unwind__prepare_access()
> > > >    in patch 10.
> >  
> > > for patchset:
> >  
> > > Acked-by: Jiri Olsa <jolsa@kernel.org>
> > 
> > Thanks, applied, build testing.
> 
> Build tested went ok, but then 'perf top' crashes:
> 
> [root@jouet ~]# perf top
> perf: Segmentation fault
> -------- backtrace --------
> perf[0x55591b]
> /lib64/libc.so.6(+0x34ab0)[0x7f38ad9c1ab0]
> perf(normalize_arch+0x27)[0x534797]
> perf(unwind__prepare_access+0xbb)[0x52b15b]
> perf(thread__insert_map+0x27)[0x4d4837]
> perf(machine__process_mmap2_event+0xd7)[0x4ca187]
> perf(perf_event__synthesize_mmap_events+0x3e2)[0x491b32]
> perf(perf_event__synthesize_threads+0x445)[0x492635]
> perf(cmd_top+0xee0)[0x442f50]
> perf[0x486a91]
> perf(main+0x6ee)[0x42485e]
> /lib64/libc.so.6(__libc_start_main+0xf0)[0x7f38ad9ad580]
> perf(_start+0x29)[0x424949]
> [0x0]
> [root@jouet ~]#
> 
> And I bet that 'perf trace' will too, lemme see, well, it crashes even
> more spetacularly, but that is the topic of another bug report, will
> send soon.
> 
> Anyway, please try your patchkit with 'perf top' and 'perf trace', as
> both don't use perf.data files, i.e. they work 'live', so probably
> things that you touch in normalize_arch() are not initialized and need
> to be setup.

Ah, no need to resend the whole patchkit, just find out what is the bug
and send me a patch and I'll insert it at the right point to avoid
introducing a bisect breaking point.

Your patchkit is in my perf/unwind branch at my tree, I already added
Jiri's Acked-by in all the patches.

git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git

Thanks,

- Arnaldo
-

[toc] | [prev] | [next] | [standalone]


#1413657

FromHekuang <hekuang@huawei.com>
Date2016-06-04 07:50 +0200
Message-ID<rGcD7-4Nz-3@gated-at.bofh.it>
In reply to#1413483

在 2016/6/4 5:09, Arnaldo Carvalho de Melo 写道:
> Em Fri, Jun 03, 2016 at 06:06:02PM -0300, Arnaldo Carvalho de Melo escreveu:
>> Em Fri, Jun 03, 2016 at 04:42:05PM -0300, Arnaldo Carvalho de Melo escreveu:
>>> Em Fri, Jun 03, 2016 at 09:06:29AM +0200, Jiri Olsa escreveu:
>>>> On Fri, Jun 03, 2016 at 03:33:09AM +0000, He Kuang wrote:
>>>>> v9:
>>>>>   - Change function unwind__register_ops() to static.
>>>>>   - Move up unwind__prepare_access() in thread__insert_map() and save
>>>>>     map_groups__remove() call.
>>>>>   - Enclose multiple line if/else into braces.
>>>>>   - Fix miss modified function declaration for unwind__prepare_access()
>>>>>     in patch 10.
>>>   
>>>> for patchset:
>>>   
>>>> Acked-by: Jiri Olsa <jolsa@kernel.org>
>>> Thanks, applied, build testing.
>> Build tested went ok, but then 'perf top' crashes:
>>
>> [root@jouet ~]# perf top
>> perf: Segmentation fault
>> -------- backtrace --------
>> perf[0x55591b]
>> /lib64/libc.so.6(+0x34ab0)[0x7f38ad9c1ab0]
>> perf(normalize_arch+0x27)[0x534797]
>> perf(unwind__prepare_access+0xbb)[0x52b15b]
>> perf(thread__insert_map+0x27)[0x4d4837]
>> perf(machine__process_mmap2_event+0xd7)[0x4ca187]
>> perf(perf_event__synthesize_mmap_events+0x3e2)[0x491b32]
>> perf(perf_event__synthesize_threads+0x445)[0x492635]
>> perf(cmd_top+0xee0)[0x442f50]
>> perf[0x486a91]
>> perf(main+0x6ee)[0x42485e]
>> /lib64/libc.so.6(__libc_start_main+0xf0)[0x7f38ad9ad580]
>> perf(_start+0x29)[0x424949]
>> [0x0]
>> [root@jouet ~]#
>>
>> And I bet that 'perf trace' will too, lemme see, well, it crashes even
>> more spetacularly, but that is the topic of another bug report, will
>> send soon.
>>
>> Anyway, please try your patchkit with 'perf top' and 'perf trace', as
>> both don't use perf.data files, i.e. they work 'live', so probably
>> things that you touch in normalize_arch() are not initialized and need
>> to be setup.
> Ah, no need to resend the whole patchkit, just find out what is the bug
> and send me a patch and I'll insert it at the right point to avoid
> introducing a bisect breaking point.
>
> Your patchkit is in my perf/unwind branch at my tree, I already added
> Jiri's Acked-by in all the patches.
>
> git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git
>
> Thanks,
>
> - Arnaldo
> -

I send the updated one after PATCH 10/14,  env->arch is null in live mode,
comments are added and "perf top/trace" works now.

Thanks.

[toc] | [prev] | [next] | [standalone]


#1416287

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-06-07 17:20 +0200
Message-ID<rHqXn-4lt-3@gated-at.bofh.it>
In reply to#1413657
Em Tue, Jun 07, 2016 at 12:12:15PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Sat, Jun 04, 2016 at 01:39:04PM +0800, Hekuang escreveu:
> > 在 2016/6/4 5:09, Arnaldo Carvalho de Melo 写道:
> > > Em Fri, Jun 03, 2016 at 06:06:02PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > > Anyway, please try your patchkit with 'perf top' and 'perf trace', as
> > > > both don't use perf.data files, i.e. they work 'live', so probably
> > > > things that you touch in normalize_arch() are not initialized and need
> > > > to be setup.
> > > Ah, no need to resend the whole patchkit, just find out what is the bug
> > > and send me a patch and I'll insert it at the right point to avoid
> > > introducing a bisect breaking point.
> 
> > > Your patchkit is in my perf/unwind branch at my tree, I already added
> > > Jiri's Acked-by in all the patches.
> 
> > > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git
> 
> > I send the updated one after PATCH 10/14,  env->arch is null in live mode,
> > comments are added and "perf top/trace" works now.
> 
> Ok, now it fails 'perf test unwind' and I bisected it to:

Further info:

[root@jouet ~]# perf test -v unwind
48: Test dwarf unwind                                        :
--- start ---
test child forked, pid 25078
got wrong number of stack entries 0 != 8
test child finished with -1
---- end ----
Test dwarf unwind: FAILED!
[root@jouet ~]#
 
> [acme@jouet linux]$ git bisect good
> e2b6ce1ca32cedeb2cef08f49aa812f0eadcc3c5 is the first bad commit
> commit e2b6ce1ca32cedeb2cef08f49aa812f0eadcc3c5
> Author: He Kuang <hekuang@huawei.com>
> Date:   Fri Jun 3 03:33:19 2016 +0000
> 
>     perf unwind: Check the target platform before assigning unwind methods
>     
>     Currently, 'perf script' uses host unwind methods to parse perf.data
>     callchain info without taking the target architecture into account, i.e.
>     assuming the perf.data file was generated on the same machine where the
>     analysis is being performed. So we get wrong result without any warnings
>     when unwinding callchains of x86(32-bit) on x86(64-bit) machine.
>     
>     This patch adds an extra step that checks the target platform before
>     assigning unwind methods. In later patches in this series, we can use
>     this info to assign the right unwind methods for supported platforms.
> 

[toc] | [prev] | [next] | [standalone]


#1416302

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-06-07 17:20 +0200
Message-ID<rHqXn-4lt-5@gated-at.bofh.it>
In reply to#1413657
Em Sat, Jun 04, 2016 at 01:39:04PM +0800, Hekuang escreveu:
> 在 2016/6/4 5:09, Arnaldo Carvalho de Melo 写道:
> > Em Fri, Jun 03, 2016 at 06:06:02PM -0300, Arnaldo Carvalho de Melo escreveu:
> > > Anyway, please try your patchkit with 'perf top' and 'perf trace', as
> > > both don't use perf.data files, i.e. they work 'live', so probably
> > > things that you touch in normalize_arch() are not initialized and need
> > > to be setup.
> > Ah, no need to resend the whole patchkit, just find out what is the bug
> > and send me a patch and I'll insert it at the right point to avoid
> > introducing a bisect breaking point.

> > Your patchkit is in my perf/unwind branch at my tree, I already added
> > Jiri's Acked-by in all the patches.

> > git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git

> I send the updated one after PATCH 10/14,  env->arch is null in live mode,
> comments are added and "perf top/trace" works now.

Ok, now it fails 'perf test unwind' and I bisected it to:


[acme@jouet linux]$ git bisect good
e2b6ce1ca32cedeb2cef08f49aa812f0eadcc3c5 is the first bad commit
commit e2b6ce1ca32cedeb2cef08f49aa812f0eadcc3c5
Author: He Kuang <hekuang@huawei.com>
Date:   Fri Jun 3 03:33:19 2016 +0000

    perf unwind: Check the target platform before assigning unwind methods
    
    Currently, 'perf script' uses host unwind methods to parse perf.data
    callchain info without taking the target architecture into account, i.e.
    assuming the perf.data file was generated on the same machine where the
    analysis is being performed. So we get wrong result without any warnings
    when unwinding callchains of x86(32-bit) on x86(64-bit) machine.
    
    This patch adds an extra step that checks the target platform before
    assigning unwind methods. In later patches in this series, we can use
    this info to assign the right unwind methods for supported platforms.

[toc] | [prev] | [next] | [standalone]


#1413484

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-06-03 23:10 +0200
Message-ID<rG4vT-8lx-13@gated-at.bofh.it>
In reply to#1413423
Em Fri, Jun 03, 2016 at 04:42:05PM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Fri, Jun 03, 2016 at 09:06:29AM +0200, Jiri Olsa escreveu:
> > On Fri, Jun 03, 2016 at 03:33:09AM +0000, He Kuang wrote:
> > > v9:
> > >  - Change function unwind__register_ops() to static.
> > >  - Move up unwind__prepare_access() in thread__insert_map() and save
> > >    map_groups__remove() call.
> > >  - Enclose multiple line if/else into braces.
> > >  - Fix miss modified function declaration for unwind__prepare_access()
> > >    in patch 10.
>  
> > for patchset:
>  
> > Acked-by: Jiri Olsa <jolsa@kernel.org>
> 
> Thanks, applied, build testing.

Build tested went ok, but then 'perf top' crashes:

[root@jouet ~]# perf top
perf: Segmentation fault
-------- backtrace --------
perf[0x55591b]
/lib64/libc.so.6(+0x34ab0)[0x7f38ad9c1ab0]
perf(normalize_arch+0x27)[0x534797]
perf(unwind__prepare_access+0xbb)[0x52b15b]
perf(thread__insert_map+0x27)[0x4d4837]
perf(machine__process_mmap2_event+0xd7)[0x4ca187]
perf(perf_event__synthesize_mmap_events+0x3e2)[0x491b32]
perf(perf_event__synthesize_threads+0x445)[0x492635]
perf(cmd_top+0xee0)[0x442f50]
perf[0x486a91]
perf(main+0x6ee)[0x42485e]
/lib64/libc.so.6(__libc_start_main+0xf0)[0x7f38ad9ad580]
perf(_start+0x29)[0x424949]
[0x0]
[root@jouet ~]#

And I bet that 'perf trace' will too, lemme see, well, it crashes even
more spetacularly, but that is the topic of another bug report, will
send soon.

Anyway, please try your patchkit with 'perf top' and 'perf trace', as
both don't use perf.data files, i.e. they work 'live', so probably
things that you touch in normalize_arch() are not initialized and need
to be setup.

- Arnaldo

[toc] | [prev] | [next] | [standalone]


#1416536

FromArnaldo Carvalho de Melo <acme@kernel.org>
Date2016-06-07 21:50 +0200
Message-ID<rHvaG-6PS-25@gated-at.bofh.it>
In reply to#1412851
Em Fri, Jun 03, 2016 at 09:06:29AM +0200, Jiri Olsa escreveu:
> On Fri, Jun 03, 2016 at 03:33:09AM +0000, He Kuang wrote:
> 
> SNIP
> 
> > 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.
> > 
> > Acked-by: Jiri Olsa <jolsa@kernel.org> for most patches except:
> > 
> > v9:
> >  - Change function unwind__register_ops() to static.
> >  - Move up unwind__prepare_access() in thread__insert_map() and save
> >    map_groups__remove() call.
> >  - Enclose multiple line if/else into braces.
> >  - Fix miss modified function declaration for unwind__prepare_access()
> >    in patch 10.
> 
> for patchset:
> 
> Acked-by: Jiri Olsa <jolsa@kernel.org>

Ok, I'm applying it, after fixing 'perf test unwind', 'perf top --call-graph dwarf'
and 'perf trace --call-graph dwarf', but I have one question, is the
scenario where we collect on a x86_64 machine and want to do analysis on
a ARM64 or x86-32 machine supported? This should be the odd case now,
but from a quick look I couldn't see this as being supported, is that
true or I was just lazy not to have tried this?

- Arnaldo

[toc] | [prev] | [next] | [standalone]


#1416982

FromHekuang <hekuang@huawei.com>
Date2016-06-08 09:40 +0200
Message-ID<rHGfL-5Ap-11@gated-at.bofh.it>
In reply to#1416536
hi

在 2016/6/8 3:44, Arnaldo Carvalho de Melo 写道:
> Em Fri, Jun 03, 2016 at 09:06:29AM +0200, Jiri Olsa escreveu:
>> On Fri, Jun 03, 2016 at 03:33:09AM +0000, He Kuang wrote:
>>
>> SNIP
>>
>>> 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.
>>>
>>> Acked-by: Jiri Olsa <jolsa@kernel.org> for most patches except:
>>>
>>> v9:
>>>   - Change function unwind__register_ops() to static.
>>>   - Move up unwind__prepare_access() in thread__insert_map() and save
>>>     map_groups__remove() call.
>>>   - Enclose multiple line if/else into braces.
>>>   - Fix miss modified function declaration for unwind__prepare_access()
>>>     in patch 10.
>> for patchset:
>>
>> Acked-by: Jiri Olsa <jolsa@kernel.org>
> Ok, I'm applying it, after fixing 'perf test unwind', 'perf top --call-graph dwarf'
> and 'perf trace --call-graph dwarf', but I have one question, is the
> scenario where we collect on a x86_64 machine and want to do analysis on
> a ARM64 or x86-32 machine supported? This should be the odd case now,
Yes, it's supported.

But I never tested this before, so I just compiled libunwind for
aarch64, and tested unwinding i686 perf.data on aarch64. Then I
found another issue I've considered but missed at some version of
this patch series.

In util/unwind-libunwind-local.c, PERF_REG_SP/IP is used, but
those macros are assigned to the host platform, we should
redefine them in the wrapper file, for example in
"util/libunwind/x86_32.c".

After fixing this problem, i686 perf.data can be parsed on
aarch64 machine.  Since you've already applied the v9 patches,
should I send patches based on the lastest tree as bug fixes or
just update v9 patches?

Thank you.

Here is the modified part:

diff --git a/tools/perf/util/libunwind/arm64.c 
b/tools/perf/util/libunwind/arm64.c
index 4fb5395..8a5c2fc 100644
--- a/tools/perf/util/libunwind/arm64.c
+++ b/tools/perf/util/libunwind/arm64.c
@@ -29,6 +29,11 @@
  #ifdef NO_LIBUNWIND_DEBUG_FRAME_AARCH64
  #define NO_LIBUNWIND_DEBUG_FRAME
  #endif
+
+#undef PERF_REG_IP
+#undef PERF_REG_SP
+#define PERF_REG_IP PERF_REG_ARM64_PC
+#define PERF_REG_SP PERF_REG_ARM64_SP
  #include "util/unwind-libunwind-local.c"

  struct unwind_libunwind_ops *
diff --git a/tools/perf/util/libunwind/x86_32.c 
b/tools/perf/util/libunwind/x86_32.c
index d98c17e..de21a39 100644
--- a/tools/perf/util/libunwind/x86_32.c
+++ b/tools/perf/util/libunwind/x86_32.c
@@ -31,6 +31,11 @@
  #ifndef NO_LIBUNWIND_DEBUG_FRAME
  #define NO_LIBUNWIND_DEBUG_FRAME
  #endif
+
+#undef PERF_REG_IP
+#undef PERF_REG_SP
+#define PERF_REG_IP PERF_REG_X86_IP
+#define PERF_REG_SP PERF_REG_X86_SP
  #include "util/unwind-libunwind-local.c"

  struct unwind_libunwind_ops *


> but from a quick look I couldn't see this as being supported, is that
> true or I was just lazy not to have tried this?
>
> - Arnaldo

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web