All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Jin Yao <yao.jin@linux.intel.com>
Cc: jolsa@kernel.org, peterz@infradead.org, mingo@redhat.com,
	alexander.shishkin@linux.intel.com, Linux-kernel@vger.kernel.org,
	ak@linux.intel.com, kan.liang@intel.com, yao.jin@intel.com
Subject: Re: [PATCH] perf report: Fix a wrong offset issue when using /proc/kcore
Date: Thu, 4 Jan 2018 15:41:20 -0300	[thread overview]
Message-ID: <20180104184120.GE14721@kernel.org> (raw)
In-Reply-To: <1514564812-17344-1-git-send-email-yao.jin@linux.intel.com>

Em Sat, Dec 30, 2017 at 12:26:52AM +0800, Jin Yao escreveu:
> When valid vmlinux is not found, perf report falls back to look
> at /proc/kcore. While in this case, it will report the impossible
> large offset. For example,

Thanks, tested and applied!

- Arnaldo
 
> perf record -b -e cycles:k find /etc/ > /dev/null
> perf report --stdio --branch-history
> 
>     22.77%  _vm_normal_page+18446603336221188162
>             |
>             ---page_remove_rmap +18446603336221188324
>                page_remove_rmap +18446603336221188487 (cycles:5)
>                unlock_page_memcg +18446603336221188096
>                page_remove_rmap +18446603336221188327 (cycles:1)
> 
> The issue is the value which is passed to parameter 'addr' in
> __get_srcline() is the objdump address. It's not correct if we calculate
> the offset by using 'addr - sym->start'.
> 
> This patch creates a new parameter 'ip' in __get_srcline(). It is not
> converted to objdump address.
> 
> With this patch, the perf report output is:
> 
>     22.77%  _vm_normal_page+66
>             |
>             ---page_remove_rmap +228
>                page_remove_rmap +391 (cycles:5)
>                unlock_page_memcg +0
>                page_remove_rmap +231 (cycles:1)
>                page_remove_rmap +236
> 
> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
> ---
>  tools/perf/util/annotate.c |  3 ++-
>  tools/perf/util/machine.c  |  2 +-
>  tools/perf/util/map.c      |  2 +-
>  tools/perf/util/sort.c     | 16 ++++++++++------
>  tools/perf/util/srcline.c  |  9 +++++----
>  tools/perf/util/srcline.h  |  5 +++--
>  6 files changed, 22 insertions(+), 15 deletions(-)
> 
> diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
> index 68e687d..28b233c 100644
> --- a/tools/perf/util/annotate.c
> +++ b/tools/perf/util/annotate.c
> @@ -1960,7 +1960,8 @@ static void annotation__calc_lines(struct annotation *notes, struct map *map,
>  		if (percent_max <= 0.5)
>  			continue;
>  
> -		al->path = get_srcline(map->dso, start + al->offset, NULL, false, true);
> +		al->path = get_srcline(map->dso, start + al->offset, NULL,
> +				       false, true, start + al->offset);
>  		insert_source_line(&tmp_root, al);
>  	}
>  
> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> index 64d255f..b05a674 100644
> --- a/tools/perf/util/machine.c
> +++ b/tools/perf/util/machine.c
> @@ -1726,7 +1726,7 @@ static char *callchain_srcline(struct map *map, struct symbol *sym, u64 ip)
>  		bool show_addr = callchain_param.key == CCKEY_ADDRESS;
>  
>  		srcline = get_srcline(map->dso, map__rip_2objdump(map, ip),
> -				      sym, show_sym, show_addr);
> +				      sym, show_sym, show_addr, ip);
>  		srcline__tree_insert(&map->dso->srclines, ip, srcline);
>  	}
>  
> diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
> index 6d40efd..8fe5703 100644
> --- a/tools/perf/util/map.c
> +++ b/tools/perf/util/map.c
> @@ -419,7 +419,7 @@ int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix,
>  	if (map && map->dso) {
>  		srcline = get_srcline(map->dso,
>  				      map__rip_2objdump(map, addr), NULL,
> -				      true, true);
> +				      true, true, addr);
>  		if (srcline != SRCLINE_UNKNOWN)
>  			ret = fprintf(fp, "%s%s", prefix, srcline);
>  		free_srcline(srcline);
> diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
> index a00eacd..211e7f3 100644
> --- a/tools/perf/util/sort.c
> +++ b/tools/perf/util/sort.c
> @@ -336,7 +336,7 @@ char *hist_entry__get_srcline(struct hist_entry *he)
>  		return SRCLINE_UNKNOWN;
>  
>  	return get_srcline(map->dso, map__rip_2objdump(map, he->ip),
> -			   he->ms.sym, true, true);
> +			   he->ms.sym, true, true, he->ip);
>  }
>  
>  static int64_t
> @@ -380,7 +380,8 @@ sort__srcline_from_cmp(struct hist_entry *left, struct hist_entry *right)
>  					   map__rip_2objdump(map,
>  							     left->branch_info->from.al_addr),
>  							 left->branch_info->from.sym,
> -							 true, true);
> +							 true, true,
> +							 left->branch_info->from.al_addr);
>  	}
>  	if (!right->branch_info->srcline_from) {
>  		struct map *map = right->branch_info->from.map;
> @@ -391,7 +392,8 @@ sort__srcline_from_cmp(struct hist_entry *left, struct hist_entry *right)
>  					     map__rip_2objdump(map,
>  							       right->branch_info->from.al_addr),
>  						     right->branch_info->from.sym,
> -						     true, true);
> +						     true, true,
> +						     right->branch_info->from.al_addr);
>  	}
>  	return strcmp(right->branch_info->srcline_from, left->branch_info->srcline_from);
>  }
> @@ -423,7 +425,8 @@ sort__srcline_to_cmp(struct hist_entry *left, struct hist_entry *right)
>  					   map__rip_2objdump(map,
>  							     left->branch_info->to.al_addr),
>  							 left->branch_info->from.sym,
> -							 true, true);
> +							 true, true,
> +							 left->branch_info->to.al_addr);
>  	}
>  	if (!right->branch_info->srcline_to) {
>  		struct map *map = right->branch_info->to.map;
> @@ -434,7 +437,8 @@ sort__srcline_to_cmp(struct hist_entry *left, struct hist_entry *right)
>  					     map__rip_2objdump(map,
>  							       right->branch_info->to.al_addr),
>  						     right->branch_info->to.sym,
> -						     true, true);
> +						     true, true,
> +						     right->branch_info->to.al_addr);
>  	}
>  	return strcmp(right->branch_info->srcline_to, left->branch_info->srcline_to);
>  }
> @@ -465,7 +469,7 @@ static char *hist_entry__get_srcfile(struct hist_entry *e)
>  		return no_srcfile;
>  
>  	sf = __get_srcline(map->dso, map__rip_2objdump(map, e->ip),
> -			 e->ms.sym, false, true, true);
> +			 e->ms.sym, false, true, true, e->ip);
>  	if (!strcmp(sf, SRCLINE_UNKNOWN))
>  		return no_srcfile;
>  	p = strchr(sf, ':');
> diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c
> index d19f05c..3c21fd0 100644
> --- a/tools/perf/util/srcline.c
> +++ b/tools/perf/util/srcline.c
> @@ -496,7 +496,8 @@ static struct inline_node *addr2inlines(const char *dso_name, u64 addr,
>  #define A2L_FAIL_LIMIT 123
>  
>  char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
> -		  bool show_sym, bool show_addr, bool unwind_inlines)
> +		  bool show_sym, bool show_addr, bool unwind_inlines,
> +		  u64 ip)
>  {
>  	char *file = NULL;
>  	unsigned line = 0;
> @@ -536,7 +537,7 @@ char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
>  
>  	if (sym) {
>  		if (asprintf(&srcline, "%s+%" PRIu64, show_sym ? sym->name : "",
> -					addr - sym->start) < 0)
> +					ip - sym->start) < 0)
>  			return SRCLINE_UNKNOWN;
>  	} else if (asprintf(&srcline, "%s[%" PRIx64 "]", dso->short_name, addr) < 0)
>  		return SRCLINE_UNKNOWN;
> @@ -550,9 +551,9 @@ void free_srcline(char *srcline)
>  }
>  
>  char *get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
> -		  bool show_sym, bool show_addr)
> +		  bool show_sym, bool show_addr, u64 ip)
>  {
> -	return __get_srcline(dso, addr, sym, show_sym, show_addr, false);
> +	return __get_srcline(dso, addr, sym, show_sym, show_addr, false, ip);
>  }
>  
>  struct srcline_node {
> diff --git a/tools/perf/util/srcline.h b/tools/perf/util/srcline.h
> index 847b708..b2bb5502 100644
> --- a/tools/perf/util/srcline.h
> +++ b/tools/perf/util/srcline.h
> @@ -11,9 +11,10 @@ struct symbol;
>  
>  extern bool srcline_full_filename;
>  char *get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
> -		  bool show_sym, bool show_addr);
> +		  bool show_sym, bool show_addr, u64 ip);
>  char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym,
> -		  bool show_sym, bool show_addr, bool unwind_inlines);
> +		  bool show_sym, bool show_addr, bool unwind_inlines,
> +		  u64 ip);
>  void free_srcline(char *srcline);
>  
>  /* insert the srcline into the DSO, which will take ownership */
> -- 
> 2.7.4

  reply	other threads:[~2018-01-04 18:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-29 16:26 [PATCH] perf report: Fix a wrong offset issue when using /proc/kcore Jin Yao
2018-01-04 18:41 ` Arnaldo Carvalho de Melo [this message]
2018-01-11  6:20 ` [tip:perf/core] " tip-bot for Jin Yao

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=20180104184120.GE14721@kernel.org \
    --to=acme@kernel.org \
    --cc=Linux-kernel@vger.kernel.org \
    --cc=ak@linux.intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@intel.com \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=yao.jin@intel.com \
    --cc=yao.jin@linux.intel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.