diff options
| author | Ingo Molnar <mingo@kernel.org> | 2017-03-28 07:44:43 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2017-03-28 07:44:43 +0200 | 
| commit | 3906a13a6b4e78fbc0def03a808f091f0dff1b44 (patch) | |
| tree | c37c8d9fbc1454e0482e60dddb4a4a4af29dfa72 /tools/perf/util/annotate.c | |
| parent | d652f4bbca35100358bad83c29ec0e40a1f8e5cc (diff) | |
| parent | 55f77128e7652e537d6c226d5b56821cdb5c22de (diff) | |
Merge tag 'perf-core-for-mingo-4.12-20170327' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:
New features:
 - Handle inline functions in callchains (Jin Yao)
 - Enable sorting by srcline as key (Milian Wolff)
Fixes:
 - Fix no_size logic in addr_filter__resolve_kernel_syms() in the
   auxtrace code (Adrian Hunter)
 - Fix some thread refcount leaks in 'perf trace' (Arnaldo Carvalho de Melo)
 - Fix divide by zero when calculating percent for an event in a group in
   the annotate by source line code (Taeung Song)
 - build-id files now aren't anymore symlinks, their parent directories
   are, so readlink the later (Taeung Song)
 - Assorted fixes for null termination problems, mostly related to
   readlink, detected by valgrind (Tommi Rantala)
Infrastructure changes:
 - Make vfs_getname probe point logic in 'perf trace' more robust
   wrt length of pathname (Arnaldo Carvalho de Melo)
 - Remove unused 'prefix' parameter from builtins main functions (Arnaldo Carvalho de Melo)
 - Show 'perf list sdt' option in man page (Ravi Bangoria)
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/util/annotate.c')
| -rw-r--r-- | tools/perf/util/annotate.c | 23 | 
1 files changed, 18 insertions, 5 deletions
| diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 22cd1dbe724b..11af5f0d56cc 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -1307,6 +1307,7 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil  {  	char linkname[PATH_MAX];  	char *build_id_filename; +	char *build_id_path = NULL;  	if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&  	    !dso__is_kcore(dso)) @@ -1322,8 +1323,14 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil  		goto fallback;  	} +	build_id_path = strdup(filename); +	if (!build_id_path) +		return -1; + +	dirname(build_id_path); +  	if (dso__is_kcore(dso) || -	    readlink(filename, linkname, sizeof(linkname)) < 0 || +	    readlink(build_id_path, linkname, sizeof(linkname)) < 0 ||  	    strstr(linkname, DSO__NAME_KALLSYMS) ||  	    access(filename, R_OK)) {  fallback: @@ -1335,6 +1342,7 @@ fallback:  		__symbol__join_symfs(filename, filename_size, dso->long_name);  	} +	free(build_id_path);  	return 0;  } @@ -1663,18 +1671,23 @@ static int symbol__get_source_line(struct symbol *sym, struct map *map,  		src_line->nr_pcnt = nr_pcnt;  		for (k = 0; k < nr_pcnt; k++) { +			double percent = 0.0; +  			h = annotation__histogram(notes, evidx + k); -			src_line->samples[k].percent = 100.0 * h->addr[i] / h->sum; +			if (h->sum) +				percent = 100.0 * h->addr[i] / h->sum; -			if (src_line->samples[k].percent > percent_max) -				percent_max = src_line->samples[k].percent; +			if (percent > percent_max) +				percent_max = percent; +			src_line->samples[k].percent = percent;  		}  		if (percent_max <= 0.5)  			goto next;  		offset = start + i; -		src_line->path = get_srcline(map->dso, offset, NULL, false); +		src_line->path = get_srcline(map->dso, offset, NULL, +					     false, true);  		insert_source_line(&tmp_root, src_line);  	next: | 
