diff options
| author | Ingo Molnar <[email protected]> | 2018-03-06 07:34:04 +0100 | 
|---|---|---|
| committer | Ingo Molnar <[email protected]> | 2018-03-06 07:34:04 +0100 | 
| commit | 55b4ce61a2a1608881ef7eab8a4e3fab3718dc4d (patch) | |
| tree | 064ffb4e72c7f710f8599564c809e4043e588c84 /tools/perf/util/annotate.c | |
| parent | 8af31363cda93724c237b6ffb24380f4441d2f8d (diff) | |
| parent | 6afad54d2f0ddebacfcf3b829147d7fed8dab298 (diff) | |
Merge tag 'perf-core-for-mingo-4.17-20180305' 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:
- Be more robust when drawing arrows in the annotation TUI, avoiding a
  segfault when jump instructions have as a target addresses in functions
  other that the one currently being annotated. The full fix will come in
  the following days, when jumping to other functions will work as call
  instructions (Arnaldo Carvalho de Melo)
- Allow asking for the maximum allowed sample rate in 'top' and
  'record', i.e. 'perf record -F max' will read the
  kernel.perf_event_max_sample_rate sysctl and use it (Arnaldo Carvalho de Melo)
- When the user specifies a freq above kernel.perf_event_max_sample_rate,
  Throttle it down to that max freq, and warn the user about it, add as
  well --strict-freq so that the previous behaviour of not starting the
  session when the desired freq can't be used can be selected (Arnaldo Carvalho de Melo)
- Find 'call' instruction target symbol at parsing time, used so far in
  the TUI, part of the infrastructure changes that will end up allowing
  for jumps to navigate to other functions, just like 'call'
  instructions. (Arnaldo Carvalho de Melo)
- Use xyarray dimensions to iterate fds in 'perf stat' (Andi Kleen)
- Ignore threads for which the current user hasn't permissions when
  enabling system-wide --per-thread (Jin Yao)
- Fix some backtrace perf test cases to use 'perf record' + 'perf script'
  instead, till 'perf trace' starts using ordered_events or equivalent
  to avoid symbol resolving artifacts due to reordering of
  PERF_RECORD_MMAP events (Jiri Olsa)
- Fix crash in 'perf record' pipe mode, it needs to allocate the ID
  array even for a single event, unlike non-pipe mode (Jiri Olsa)
- Make annoying fallback message on older kernels with newer 'perf top'
  binaries trying to use overwrite mode and that not being present
  in the older kernels (Kan Liang)
- Switch last users of old APIs to the newer perf_mmap__read_event()
  one, then discard those old mmap read forward APIs (Kan Liang)
- Fix the usage on the 'perf kallsyms' man page (Sangwon Hong)
- Simplify cgroup arguments when tracking multiple events (weiping zhang)
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
Diffstat (limited to 'tools/perf/util/annotate.c')
| -rw-r--r-- | tools/perf/util/annotate.c | 38 | 
1 files changed, 21 insertions, 17 deletions
| diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 28b233c3dcbe..49ff825f745c 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -187,6 +187,9 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2)  static int call__parse(struct arch *arch, struct ins_operands *ops, struct map *map)  {  	char *endptr, *tok, *name; +	struct addr_map_symbol target = { +		.map = map, +	};  	ops->target.addr = strtoull(ops->raw, &endptr, 16); @@ -208,28 +211,29 @@ static int call__parse(struct arch *arch, struct ins_operands *ops, struct map *  	ops->target.name = strdup(name);  	*tok = '>'; -	return ops->target.name == NULL ? -1 : 0; +	if (ops->target.name == NULL) +		return -1; +find_target: +	target.addr = map__objdump_2mem(map, ops->target.addr); -indirect_call: -	tok = strchr(endptr, '*'); -	if (tok == NULL) { -		struct symbol *sym = map__find_symbol(map, map->map_ip(map, ops->target.addr)); -		if (sym != NULL) -			ops->target.name = strdup(sym->name); -		else -			ops->target.addr = 0; -		return 0; -	} +	if (map_groups__find_ams(&target) == 0 && +	    map__rip_2objdump(target.map, map->map_ip(target.map, target.addr)) == ops->target.addr) +		ops->target.sym = target.sym; -	ops->target.addr = strtoull(tok + 1, NULL, 16);  	return 0; + +indirect_call: +	tok = strchr(endptr, '*'); +	if (tok != NULL) +		ops->target.addr = strtoull(tok + 1, NULL, 16); +	goto find_target;  }  static int call__scnprintf(struct ins *ins, char *bf, size_t size,  			   struct ins_operands *ops)  { -	if (ops->target.name) -		return scnprintf(bf, size, "%-6s %s", ins->name, ops->target.name); +	if (ops->target.sym) +		return scnprintf(bf, size, "%-6s %s", ins->name, ops->target.sym->name);  	if (ops->target.addr == 0)  		return ins__raw_scnprintf(ins, bf, size, ops); @@ -1283,8 +1287,8 @@ static int symbol__parse_objdump_line(struct symbol *sym, FILE *file,  		dl->ops.target.offset_avail = true;  	} -	/* kcore has no symbols, so add the call target name */ -	if (dl->ins.ops && ins__is_call(&dl->ins) && !dl->ops.target.name) { +	/* kcore has no symbols, so add the call target symbol */ +	if (dl->ins.ops && ins__is_call(&dl->ins) && !dl->ops.target.sym) {  		struct addr_map_symbol target = {  			.map = map,  			.addr = dl->ops.target.addr, @@ -1292,7 +1296,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, FILE *file,  		if (!map_groups__find_ams(&target) &&  		    target.sym->start == target.al_addr) -			dl->ops.target.name = strdup(target.sym->name); +			dl->ops.target.sym = target.sym;  	}  	annotation_line__add(&dl->al, ¬es->src->source); |