Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf script: Show text poke address symbol

It is generally more useful to show the symbol with an address. In this
case, the print function requires the 'machine' which means changing
callers to provide it as a parameter. It is optional because most events
do not need it and the callers that matter can provide it.

Committer notes:

Made 'union perf_event' continue to be the first parameter to the
perf_event__fprintf() and perf_event__fprintf_text_poke() events.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: x86@kernel.org
Link: http://lore.kernel.org/lkml/20200512121922.8997-16-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Adrian Hunter and committed by
Arnaldo Carvalho de Melo
7eeb9855 92ecf3a6

+24 -13
+2 -2
tools/perf/builtin-script.c
··· 2178 2178 event->header.type, stdout); 2179 2179 } 2180 2180 2181 - perf_event__fprintf(event, stdout); 2181 + perf_event__fprintf(event, machine, stdout); 2182 2182 2183 2183 thread__put(thread); 2184 2184 ··· 2313 2313 struct ordered_events *oe __maybe_unused) 2314 2314 2315 2315 { 2316 - perf_event__fprintf(event, stdout); 2316 + perf_event__fprintf(event, NULL, stdout); 2317 2317 return 0; 2318 2318 } 2319 2319
+2 -2
tools/perf/tests/perf-record.c
··· 185 185 err = perf_evlist__parse_sample(evlist, event, &sample); 186 186 if (err < 0) { 187 187 if (verbose > 0) 188 - perf_event__fprintf(event, stderr); 188 + perf_event__fprintf(event, NULL, stderr); 189 189 pr_debug("Couldn't parse sample\n"); 190 190 goto out_delete_evlist; 191 191 } 192 192 193 193 if (verbose > 0) { 194 194 pr_info("%" PRIu64" %d ", sample.time, sample.cpu); 195 - perf_event__fprintf(event, stderr); 195 + perf_event__fprintf(event, NULL, stderr); 196 196 } 197 197 198 198 if (prev_time > sample.time) {
+16 -5
tools/perf/util/event.c
··· 440 440 } 441 441 } 442 442 443 - size_t perf_event__fprintf_text_poke(union perf_event *event, FILE *fp) 443 + size_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine, FILE *fp) 444 444 { 445 445 struct perf_record_text_poke_event *tp = &event->text_poke; 446 446 size_t ret; 447 447 bool old; 448 448 449 - ret = fprintf(fp, " %" PRI_lx64 " old len %u new len %u\n", 450 - tp->addr, tp->old_len, tp->new_len); 449 + ret = fprintf(fp, " %" PRI_lx64 " ", tp->addr); 450 + if (machine) { 451 + struct addr_location al; 452 + 453 + al.map = maps__find(&machine->kmaps, tp->addr); 454 + if (al.map && map__load(al.map) >= 0) { 455 + al.addr = al.map->map_ip(al.map, tp->addr); 456 + al.sym = map__find_symbol(al.map, al.addr); 457 + if (al.sym) 458 + ret += symbol__fprintf_symname_offs(al.sym, &al, fp); 459 + } 460 + } 461 + ret += fprintf(fp, " old len %u new len %u\n", tp->old_len, tp->new_len); 451 462 old = true; 452 463 ret += binary__fprintf(tp->bytes, tp->old_len, 16, text_poke_printer, 453 464 &old, fp); ··· 468 457 return ret; 469 458 } 470 459 471 - size_t perf_event__fprintf(union perf_event *event, FILE *fp) 460 + size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp) 472 461 { 473 462 size_t ret = fprintf(fp, "PERF_RECORD_%s", 474 463 perf_event__name(event->header.type)); ··· 513 502 ret += perf_event__fprintf_bpf(event, fp); 514 503 break; 515 504 case PERF_RECORD_TEXT_POKE: 516 - ret += perf_event__fprintf_text_poke(event, fp); 505 + ret += perf_event__fprintf_text_poke(event, machine, fp); 517 506 break; 518 507 default: 519 508 ret += fprintf(fp, "\n");
+2 -2
tools/perf/util/event.h
··· 389 389 size_t perf_event__fprintf_cgroup(union perf_event *event, FILE *fp); 390 390 size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp); 391 391 size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp); 392 - size_t perf_event__fprintf_text_poke(union perf_event *event, FILE *fp); 393 - size_t perf_event__fprintf(union perf_event *event, FILE *fp); 392 + size_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine,FILE *fp); 393 + size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp); 394 394 395 395 int kallsyms__get_function_start(const char *kallsyms_filename, 396 396 const char *symbol_name, u64 *addr);
+1 -1
tools/perf/util/intel-pt.c
··· 236 236 if (!intel_pt_enable_logging || !f) 237 237 return; 238 238 239 - perf_event__fprintf(event, f); 239 + perf_event__fprintf(event, NULL, f); 240 240 } 241 241 242 242 static void intel_pt_dump_sample(struct perf_session *session,
+1 -1
tools/perf/util/machine.c
··· 821 821 u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; 822 822 823 823 if (dump_trace) 824 - perf_event__fprintf_text_poke(event, stdout); 824 + perf_event__fprintf_text_poke(event, machine, stdout); 825 825 826 826 if (!event->text_poke.new_len) 827 827 return 0;