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>
This commit is contained in:
Adrian Hunter 2020-05-12 15:19:22 +03:00 committed by Arnaldo Carvalho de Melo
parent 92ecf3a64f
commit 7eeb9855c1
6 changed files with 24 additions and 13 deletions

View File

@ -2178,7 +2178,7 @@ static int print_event_with_time(struct perf_tool *tool,
event->header.type, stdout); event->header.type, stdout);
} }
perf_event__fprintf(event, stdout); perf_event__fprintf(event, machine, stdout);
thread__put(thread); thread__put(thread);
@ -2313,7 +2313,7 @@ process_finished_round_event(struct perf_tool *tool __maybe_unused,
struct ordered_events *oe __maybe_unused) struct ordered_events *oe __maybe_unused)
{ {
perf_event__fprintf(event, stdout); perf_event__fprintf(event, NULL, stdout);
return 0; return 0;
} }

View File

@ -185,14 +185,14 @@ int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unus
err = perf_evlist__parse_sample(evlist, event, &sample); err = perf_evlist__parse_sample(evlist, event, &sample);
if (err < 0) { if (err < 0) {
if (verbose > 0) if (verbose > 0)
perf_event__fprintf(event, stderr); perf_event__fprintf(event, NULL, stderr);
pr_debug("Couldn't parse sample\n"); pr_debug("Couldn't parse sample\n");
goto out_delete_evlist; goto out_delete_evlist;
} }
if (verbose > 0) { if (verbose > 0) {
pr_info("%" PRIu64" %d ", sample.time, sample.cpu); pr_info("%" PRIu64" %d ", sample.time, sample.cpu);
perf_event__fprintf(event, stderr); perf_event__fprintf(event, NULL, stderr);
} }
if (prev_time > sample.time) { if (prev_time > sample.time) {

View File

@ -440,14 +440,25 @@ static int text_poke_printer(enum binary_printer_ops op, unsigned int val,
} }
} }
size_t perf_event__fprintf_text_poke(union perf_event *event, FILE *fp) size_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine, FILE *fp)
{ {
struct perf_record_text_poke_event *tp = &event->text_poke; struct perf_record_text_poke_event *tp = &event->text_poke;
size_t ret; size_t ret;
bool old; bool old;
ret = fprintf(fp, " %" PRI_lx64 " old len %u new len %u\n", ret = fprintf(fp, " %" PRI_lx64 " ", tp->addr);
tp->addr, tp->old_len, tp->new_len); if (machine) {
struct addr_location al;
al.map = maps__find(&machine->kmaps, tp->addr);
if (al.map && map__load(al.map) >= 0) {
al.addr = al.map->map_ip(al.map, tp->addr);
al.sym = map__find_symbol(al.map, al.addr);
if (al.sym)
ret += symbol__fprintf_symname_offs(al.sym, &al, fp);
}
}
ret += fprintf(fp, " old len %u new len %u\n", tp->old_len, tp->new_len);
old = true; old = true;
ret += binary__fprintf(tp->bytes, tp->old_len, 16, text_poke_printer, ret += binary__fprintf(tp->bytes, tp->old_len, 16, text_poke_printer,
&old, fp); &old, fp);
@ -457,7 +468,7 @@ size_t perf_event__fprintf_text_poke(union perf_event *event, FILE *fp)
return ret; return ret;
} }
size_t perf_event__fprintf(union perf_event *event, FILE *fp) size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp)
{ {
size_t ret = fprintf(fp, "PERF_RECORD_%s", size_t ret = fprintf(fp, "PERF_RECORD_%s",
perf_event__name(event->header.type)); perf_event__name(event->header.type));
@ -502,7 +513,7 @@ size_t perf_event__fprintf(union perf_event *event, FILE *fp)
ret += perf_event__fprintf_bpf(event, fp); ret += perf_event__fprintf_bpf(event, fp);
break; break;
case PERF_RECORD_TEXT_POKE: case PERF_RECORD_TEXT_POKE:
ret += perf_event__fprintf_text_poke(event, fp); ret += perf_event__fprintf_text_poke(event, machine, fp);
break; break;
default: default:
ret += fprintf(fp, "\n"); ret += fprintf(fp, "\n");

View File

@ -389,8 +389,8 @@ size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_cgroup(union perf_event *event, FILE *fp); size_t perf_event__fprintf_cgroup(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp); size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp); size_t perf_event__fprintf_bpf(union perf_event *event, FILE *fp);
size_t perf_event__fprintf_text_poke(union perf_event *event, FILE *fp); size_t perf_event__fprintf_text_poke(union perf_event *event, struct machine *machine,FILE *fp);
size_t perf_event__fprintf(union perf_event *event, FILE *fp); size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FILE *fp);
int kallsyms__get_function_start(const char *kallsyms_filename, int kallsyms__get_function_start(const char *kallsyms_filename,
const char *symbol_name, u64 *addr); const char *symbol_name, u64 *addr);

View File

@ -236,7 +236,7 @@ static void intel_pt_log_event(union perf_event *event)
if (!intel_pt_enable_logging || !f) if (!intel_pt_enable_logging || !f)
return; return;
perf_event__fprintf(event, f); perf_event__fprintf(event, NULL, f);
} }
static void intel_pt_dump_sample(struct perf_session *session, static void intel_pt_dump_sample(struct perf_session *session,

View File

@ -821,7 +821,7 @@ int machine__process_text_poke(struct machine *machine, union perf_event *event,
u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
if (dump_trace) if (dump_trace)
perf_event__fprintf_text_poke(event, stdout); perf_event__fprintf_text_poke(event, machine, stdout);
if (!event->text_poke.new_len) if (!event->text_poke.new_len)
return 0; return 0;