public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: He Kuang <hekuang@huawei.com>
Cc: peterz@infradead.org, mingo@redhat.com,
	alexander.shishkin@linux.intel.com, jolsa@redhat.com,
	wangnan0@huawei.com, jpoimboe@redhat.com, ak@linux.intel.com,
	eranian@google.com, namhyung@kernel.org, adrian.hunter@intel.com,
	sukadev@linux.vnet.ibm.com, masami.hiramatsu.pt@hitachi.com,
	tumanova@linux.vnet.ibm.com, kan.liang@intel.com,
	penberg@kernel.org, dsahern@gmail.com,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 2/6] perf tools: Promote proper messages for cross-platform unwind
Date: Thu, 19 May 2016 11:50:10 -0300	[thread overview]
Message-ID: <20160519145010.GA22286@kernel.org> (raw)
In-Reply-To: <1463658462-85131-3-git-send-email-hekuang@huawei.com>

Em Thu, May 19, 2016 at 11:47:38AM +0000, He Kuang escreveu:
> Currently, perf script uses host unwind methods to parse perf.data
> callchain info regardless of the target architecture. So we get wrong
> result and no promotion when unwinding callchains of x86(32-bit) on

What you mean by "promotion" here? Can you use some other synonym so
that I can make sense of this description?

> x86(64-bit) machine.
> 
> This patch shows proper error messages when we do remote unwind
> x86(32-bit) on other machines. Same thing for other platforms will be
> added in next patches.
> 
> Common functions which will be used by both local unwind and remote
> unwind are separated into new file 'unwind-libunwind_common.c'.
> 
> Signed-off-by: He Kuang <hekuang@huawei.com>
> ---
>  tools/perf/arch/common.c                  |  2 +-
>  tools/perf/arch/common.h                  |  1 +
>  tools/perf/config/Makefile                |  6 ++++++
>  tools/perf/util/Build                     |  1 +
>  tools/perf/util/thread.c                  |  2 ++
>  tools/perf/util/unwind-libunwind_common.c | 34 +++++++++++++++++++++++++++++++
>  tools/perf/util/unwind.h                  |  5 +++++
>  7 files changed, 50 insertions(+), 1 deletion(-)
>  create mode 100644 tools/perf/util/unwind-libunwind_common.c
> 
> 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 */
> diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
> index 1e46277..a86b864 100644
> --- a/tools/perf/config/Makefile
> +++ b/tools/perf/config/Makefile
> @@ -345,6 +345,12 @@ ifeq ($(ARCH),powerpc)
>  endif
>  
>  ifndef NO_LIBUNWIND
> +  ifeq ($(feature-libunwind-x86), 1)
> +    LIBUNWIND_LIBS += -lunwind-x86
> +    $(call detected,CONFIG_LIBUNWIND_X86)
> +    CFLAGS += -DHAVE_LIBUNWIND_X86_SUPPORT
> +  endif
> +
>    ifneq ($(feature-libunwind), 1)
>      msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
>      NO_LIBUNWIND := 1
> diff --git a/tools/perf/util/Build b/tools/perf/util/Build
> index 8c6c8a0..25c31fb 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_LIBUNWIND)          += unwind-libunwind.o
> +libperf-$(CONFIG_LIBUNWIND)          += unwind-libunwind_common.o
>  
>  libperf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
>  
> diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
> index 45fcb71..3043113 100644
> --- a/tools/perf/util/thread.c
> +++ b/tools/perf/util/thread.c
> @@ -205,6 +205,8 @@ void thread__insert_map(struct thread *thread, struct map *map)
>  {
>  	map_groups__fixup_overlappings(thread->mg, map, stderr);
>  	map_groups__insert(thread->mg, map);
> +
> +	unwind__get_arch(thread, map);
>  }
>  
>  static int thread__clone_map_groups(struct thread *thread,
> diff --git a/tools/perf/util/unwind-libunwind_common.c b/tools/perf/util/unwind-libunwind_common.c
> new file mode 100644
> index 0000000..3946c99
> --- /dev/null
> +++ b/tools/perf/util/unwind-libunwind_common.c
> @@ -0,0 +1,34 @@
> +#include "thread.h"
> +#include "session.h"
> +#include "unwind.h"
> +#include "symbol.h"
> +#include "debug.h"
> +#include "arch/common.h"
> +
> +void unwind__get_arch(struct thread *thread, struct map *map)
> +{
> +	const char *arch;
> +	enum dso_type dso_type;
> +
> +	if (!thread->mg->machine->env)
> +		return;
> +
> +	dso_type = dso__type(map->dso, thread->mg->machine);
> +	if (dso_type == DSO__TYPE_UNKNOWN)
> +		return;
> +
> +	if (thread->addr_space)
> +		pr_debug("unwind: thread map already set, 64bit is %d, dso=%s\n",
> +			 dso_type == DSO__TYPE_64BIT, map->dso->name);
> +
> +	arch = normalize_arch(thread->mg->machine->env->arch);
> +
> +	if (!strcmp(arch, "x86")) {
> +		if (dso_type != DSO__TYPE_64BIT)
> +#ifdef HAVE_LIBUNWIND_X86_SUPPORT
> +			pr_err("unwind: target platform=%s is not implemented\n", arch);
> +#else
> +			pr_err("unwind: target platform=%s is not supported\n", arch);
> +#endif
> +	}
> +}
> diff --git a/tools/perf/util/unwind.h b/tools/perf/util/unwind.h
> index 12790cf..889d630 100644
> --- a/tools/perf/util/unwind.h
> +++ b/tools/perf/util/unwind.h
> @@ -24,6 +24,7 @@ int libunwind__arch_reg_id(int regnum);
>  int unwind__prepare_access(struct thread *thread);
>  void unwind__flush_access(struct thread *thread);
>  void unwind__finish_access(struct thread *thread);
> +void unwind__get_arch(struct thread *thread, struct map *map);
>  #else
>  static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
>  {
> @@ -32,6 +33,8 @@ static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
>  
>  static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
>  static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
> +static inline void unwind__get_arch(struct thread *thread __maybe_unused,
> +				    struct map *map __maybe_unused) {}
>  #endif
>  #else
>  static inline int
> @@ -51,5 +54,7 @@ static inline int unwind__prepare_access(struct thread *thread __maybe_unused)
>  
>  static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
>  static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
> +static inline void unwind__get_arch(struct thread *thread __maybe_unused,
> +				    struct map *map __maybe_unused) {}
>  #endif /* HAVE_DWARF_UNWIND_SUPPORT */
>  #endif /* __UNWIND_H */
> -- 
> 1.8.5.2

  reply	other threads:[~2016-05-19 14:50 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-19 11:47 [PATCH v4 0/6] Add support for remote unwind He Kuang
2016-05-19 11:47 ` [PATCH v4 1/6] perf tools: Set buildid dir under symfs when --symfs is provided He Kuang
2016-05-19 14:23   ` David Ahern
2016-05-19 16:07   ` Jiri Olsa
2016-05-20 17:46   ` [tip:perf/urgent] " tip-bot for He Kuang
2016-05-19 11:47 ` [PATCH v4 2/6] perf tools: Promote proper messages for cross-platform unwind He Kuang
2016-05-19 14:50   ` Arnaldo Carvalho de Melo [this message]
2016-05-19 16:19     ` Jiri Olsa
2016-05-20  3:00       ` Hekuang
2016-05-19 16:46   ` Jiri Olsa
2016-05-19 17:15     ` Jiri Olsa
2016-05-20  2:59     ` Hekuang
2016-05-20  9:53       ` Jiri Olsa
2016-05-19 11:47 ` [PATCH v4 3/6] perf tools: Separate local and remote unwind support detection He Kuang
2016-05-19 11:47 ` [PATCH v4 4/6] perf callchain: Add support for cross-platform unwind He Kuang
2016-05-19 11:47 ` [PATCH v4 5/6] perf callchain: Support x86 target platform He Kuang
2016-05-19 11:47 ` [PATCH v4 6/6] perf callchain: Support aarch64 cross-platform He Kuang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160519145010.GA22286@kernel.org \
    --to=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=dsahern@gmail.com \
    --cc=eranian@google.com \
    --cc=hekuang@huawei.com \
    --cc=jolsa@redhat.com \
    --cc=jpoimboe@redhat.com \
    --cc=kan.liang@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=penberg@kernel.org \
    --cc=peterz@infradead.org \
    --cc=sukadev@linux.vnet.ibm.com \
    --cc=tumanova@linux.vnet.ibm.com \
    --cc=wangnan0@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox