Commit 2292083f authored by Alexey Bayduraev's avatar Alexey Bayduraev Committed by Arnaldo Carvalho de Melo

perf report: Output data file name in raw trace dump

Print path and name of a data file into raw dump (-D)
<file_offset>@<path/file>:

  0x2226a@perf.data [0x30]: event: 9
or
  0x15cc36@perf.data/data.7 [0x30]: event: 9
Reviewed-by: default avatarRiccardo Mancini <rickyman7@gmail.com>
Signed-off-by: default avatarAlexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Tested-by: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarRiccardo Mancini <rickyman7@gmail.com>
Acked-by: default avatarAndi Kleen <ak@linux.intel.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Antonov <alexander.antonov@linux.intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexei Budankov <abudankov@huawei.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/e8378fd4910c10751b001be880705653989283c2.1642440724.git.alexey.v.bayduraev@linux.intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent bb6be405
...@@ -111,7 +111,8 @@ static int perf_event__repipe_op2_synth(struct perf_session *session, ...@@ -111,7 +111,8 @@ static int perf_event__repipe_op2_synth(struct perf_session *session,
static int perf_event__repipe_op4_synth(struct perf_session *session, static int perf_event__repipe_op4_synth(struct perf_session *session,
union perf_event *event, union perf_event *event,
u64 data __maybe_unused) u64 data __maybe_unused,
const char *str __maybe_unused)
{ {
return perf_event__repipe_synth(session->tool, event); return perf_event__repipe_synth(session->tool, event);
} }
......
...@@ -771,7 +771,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx, ...@@ -771,7 +771,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
return -1; return -1;
} }
err = perf_session__queue_event(kvm->session, event, timestamp, 0); err = perf_session__queue_event(kvm->session, event, timestamp, 0, NULL);
/* /*
* FIXME: Here we can't consume the event, as perf_session__queue_event will * FIXME: Here we can't consume the event, as perf_session__queue_event will
* point to it, and it'll get possibly overwritten by the kernel. * point to it, and it'll get possibly overwritten by the kernel.
......
...@@ -888,7 +888,7 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx) ...@@ -888,7 +888,7 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
if (ret && ret != -1) if (ret && ret != -1)
break; break;
ret = ordered_events__queue(top->qe.in, event, last_timestamp, 0); ret = ordered_events__queue(top->qe.in, event, last_timestamp, 0, NULL);
if (ret) if (ret)
break; break;
......
...@@ -3782,7 +3782,7 @@ static int trace__deliver_event(struct trace *trace, union perf_event *event) ...@@ -3782,7 +3782,7 @@ static int trace__deliver_event(struct trace *trace, union perf_event *event)
if (err && err != -1) if (err && err != -1)
return err; return err;
err = ordered_events__queue(&trace->oe.data, event, trace->oe.last, 0); err = ordered_events__queue(&trace->oe.data, event, trace->oe.last, 0, NULL);
if (err) if (err)
return err; return err;
......
...@@ -192,7 +192,7 @@ void ordered_events__delete(struct ordered_events *oe, struct ordered_event *eve ...@@ -192,7 +192,7 @@ void ordered_events__delete(struct ordered_events *oe, struct ordered_event *eve
} }
int ordered_events__queue(struct ordered_events *oe, union perf_event *event, int ordered_events__queue(struct ordered_events *oe, union perf_event *event,
u64 timestamp, u64 file_offset) u64 timestamp, u64 file_offset, const char *file_path)
{ {
struct ordered_event *oevent; struct ordered_event *oevent;
...@@ -217,6 +217,7 @@ int ordered_events__queue(struct ordered_events *oe, union perf_event *event, ...@@ -217,6 +217,7 @@ int ordered_events__queue(struct ordered_events *oe, union perf_event *event,
return -ENOMEM; return -ENOMEM;
oevent->file_offset = file_offset; oevent->file_offset = file_offset;
oevent->file_path = file_path;
return 0; return 0;
} }
......
...@@ -9,6 +9,7 @@ struct perf_sample; ...@@ -9,6 +9,7 @@ struct perf_sample;
struct ordered_event { struct ordered_event {
u64 timestamp; u64 timestamp;
u64 file_offset; u64 file_offset;
const char *file_path;
union perf_event *event; union perf_event *event;
struct list_head list; struct list_head list;
}; };
...@@ -53,7 +54,7 @@ struct ordered_events { ...@@ -53,7 +54,7 @@ struct ordered_events {
}; };
int ordered_events__queue(struct ordered_events *oe, union perf_event *event, int ordered_events__queue(struct ordered_events *oe, union perf_event *event,
u64 timestamp, u64 file_offset); u64 timestamp, u64 file_offset, const char *file_path);
void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event); void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event);
int ordered_events__flush(struct ordered_events *oe, enum oe_flush how); int ordered_events__flush(struct ordered_events *oe, enum oe_flush how);
int ordered_events__flush_time(struct ordered_events *oe, u64 timestamp); int ordered_events__flush_time(struct ordered_events *oe, u64 timestamp);
......
...@@ -39,7 +39,8 @@ ...@@ -39,7 +39,8 @@
#ifdef HAVE_ZSTD_SUPPORT #ifdef HAVE_ZSTD_SUPPORT
static int perf_session__process_compressed_event(struct perf_session *session, static int perf_session__process_compressed_event(struct perf_session *session,
union perf_event *event, u64 file_offset) union perf_event *event, u64 file_offset,
const char *file_path)
{ {
void *src; void *src;
size_t decomp_size, src_size; size_t decomp_size, src_size;
...@@ -61,6 +62,7 @@ static int perf_session__process_compressed_event(struct perf_session *session, ...@@ -61,6 +62,7 @@ static int perf_session__process_compressed_event(struct perf_session *session,
} }
decomp->file_pos = file_offset; decomp->file_pos = file_offset;
decomp->file_path = file_path;
decomp->mmap_len = mmap_len; decomp->mmap_len = mmap_len;
decomp->head = 0; decomp->head = 0;
...@@ -100,7 +102,8 @@ static int perf_session__process_compressed_event(struct perf_session *session, ...@@ -100,7 +102,8 @@ static int perf_session__process_compressed_event(struct perf_session *session,
static int perf_session__deliver_event(struct perf_session *session, static int perf_session__deliver_event(struct perf_session *session,
union perf_event *event, union perf_event *event,
struct perf_tool *tool, struct perf_tool *tool,
u64 file_offset); u64 file_offset,
const char *file_path);
static int perf_session__open(struct perf_session *session, int repipe_fd) static int perf_session__open(struct perf_session *session, int repipe_fd)
{ {
...@@ -182,7 +185,8 @@ static int ordered_events__deliver_event(struct ordered_events *oe, ...@@ -182,7 +185,8 @@ static int ordered_events__deliver_event(struct ordered_events *oe,
ordered_events); ordered_events);
return perf_session__deliver_event(session, event->event, return perf_session__deliver_event(session, event->event,
session->tool, event->file_offset); session->tool, event->file_offset,
event->file_path);
} }
struct perf_session *__perf_session__new(struct perf_data *data, struct perf_session *__perf_session__new(struct perf_data *data,
...@@ -471,7 +475,8 @@ static int process_event_time_conv_stub(struct perf_session *perf_session __mayb ...@@ -471,7 +475,8 @@ static int process_event_time_conv_stub(struct perf_session *perf_session __mayb
static int perf_session__process_compressed_event_stub(struct perf_session *session __maybe_unused, static int perf_session__process_compressed_event_stub(struct perf_session *session __maybe_unused,
union perf_event *event __maybe_unused, union perf_event *event __maybe_unused,
u64 file_offset __maybe_unused) u64 file_offset __maybe_unused,
const char *file_path __maybe_unused)
{ {
dump_printf(": unhandled!\n"); dump_printf(": unhandled!\n");
return 0; return 0;
...@@ -1072,9 +1077,9 @@ static int process_finished_round(struct perf_tool *tool __maybe_unused, ...@@ -1072,9 +1077,9 @@ static int process_finished_round(struct perf_tool *tool __maybe_unused,
} }
int perf_session__queue_event(struct perf_session *s, union perf_event *event, int perf_session__queue_event(struct perf_session *s, union perf_event *event,
u64 timestamp, u64 file_offset) u64 timestamp, u64 file_offset, const char *file_path)
{ {
return ordered_events__queue(&s->ordered_events, event, timestamp, file_offset); return ordered_events__queue(&s->ordered_events, event, timestamp, file_offset, file_path);
} }
static void callchain__lbr_callstack_printf(struct perf_sample *sample) static void callchain__lbr_callstack_printf(struct perf_sample *sample)
...@@ -1277,13 +1282,14 @@ static void sample_read__printf(struct perf_sample *sample, u64 read_format) ...@@ -1277,13 +1282,14 @@ static void sample_read__printf(struct perf_sample *sample, u64 read_format)
} }
static void dump_event(struct evlist *evlist, union perf_event *event, static void dump_event(struct evlist *evlist, union perf_event *event,
u64 file_offset, struct perf_sample *sample) u64 file_offset, struct perf_sample *sample,
const char *file_path)
{ {
if (!dump_trace) if (!dump_trace)
return; return;
printf("\n%#" PRIx64 " [%#x]: event: %d\n", printf("\n%#" PRIx64 "@%s [%#x]: event: %d\n",
file_offset, event->header.size, event->header.type); file_offset, file_path, event->header.size, event->header.type);
trace_event(event); trace_event(event);
if (event->header.type == PERF_RECORD_SAMPLE && evlist->trace_event_sample_raw) if (event->header.type == PERF_RECORD_SAMPLE && evlist->trace_event_sample_raw)
...@@ -1486,12 +1492,13 @@ static int machines__deliver_event(struct machines *machines, ...@@ -1486,12 +1492,13 @@ static int machines__deliver_event(struct machines *machines,
struct evlist *evlist, struct evlist *evlist,
union perf_event *event, union perf_event *event,
struct perf_sample *sample, struct perf_sample *sample,
struct perf_tool *tool, u64 file_offset) struct perf_tool *tool, u64 file_offset,
const char *file_path)
{ {
struct evsel *evsel; struct evsel *evsel;
struct machine *machine; struct machine *machine;
dump_event(evlist, event, file_offset, sample); dump_event(evlist, event, file_offset, sample, file_path);
evsel = evlist__id2evsel(evlist, sample->id); evsel = evlist__id2evsel(evlist, sample->id);
...@@ -1573,7 +1580,8 @@ static int machines__deliver_event(struct machines *machines, ...@@ -1573,7 +1580,8 @@ static int machines__deliver_event(struct machines *machines,
static int perf_session__deliver_event(struct perf_session *session, static int perf_session__deliver_event(struct perf_session *session,
union perf_event *event, union perf_event *event,
struct perf_tool *tool, struct perf_tool *tool,
u64 file_offset) u64 file_offset,
const char *file_path)
{ {
struct perf_sample sample; struct perf_sample sample;
int ret = evlist__parse_sample(session->evlist, event, &sample); int ret = evlist__parse_sample(session->evlist, event, &sample);
...@@ -1590,7 +1598,7 @@ static int perf_session__deliver_event(struct perf_session *session, ...@@ -1590,7 +1598,7 @@ static int perf_session__deliver_event(struct perf_session *session,
return 0; return 0;
ret = machines__deliver_event(&session->machines, session->evlist, ret = machines__deliver_event(&session->machines, session->evlist,
event, &sample, tool, file_offset); event, &sample, tool, file_offset, file_path);
if (dump_trace && sample.aux_sample.size) if (dump_trace && sample.aux_sample.size)
auxtrace__dump_auxtrace_sample(session, &sample); auxtrace__dump_auxtrace_sample(session, &sample);
...@@ -1600,7 +1608,8 @@ static int perf_session__deliver_event(struct perf_session *session, ...@@ -1600,7 +1608,8 @@ static int perf_session__deliver_event(struct perf_session *session,
static s64 perf_session__process_user_event(struct perf_session *session, static s64 perf_session__process_user_event(struct perf_session *session,
union perf_event *event, union perf_event *event,
u64 file_offset) u64 file_offset,
const char *file_path)
{ {
struct ordered_events *oe = &session->ordered_events; struct ordered_events *oe = &session->ordered_events;
struct perf_tool *tool = session->tool; struct perf_tool *tool = session->tool;
...@@ -1610,7 +1619,7 @@ static s64 perf_session__process_user_event(struct perf_session *session, ...@@ -1610,7 +1619,7 @@ static s64 perf_session__process_user_event(struct perf_session *session,
if (event->header.type != PERF_RECORD_COMPRESSED || if (event->header.type != PERF_RECORD_COMPRESSED ||
tool->compressed == perf_session__process_compressed_event_stub) tool->compressed == perf_session__process_compressed_event_stub)
dump_event(session->evlist, event, file_offset, &sample); dump_event(session->evlist, event, file_offset, &sample, file_path);
/* These events are processed right away */ /* These events are processed right away */
switch (event->header.type) { switch (event->header.type) {
...@@ -1669,9 +1678,9 @@ static s64 perf_session__process_user_event(struct perf_session *session, ...@@ -1669,9 +1678,9 @@ static s64 perf_session__process_user_event(struct perf_session *session,
case PERF_RECORD_HEADER_FEATURE: case PERF_RECORD_HEADER_FEATURE:
return tool->feature(session, event); return tool->feature(session, event);
case PERF_RECORD_COMPRESSED: case PERF_RECORD_COMPRESSED:
err = tool->compressed(session, event, file_offset); err = tool->compressed(session, event, file_offset, file_path);
if (err) if (err)
dump_event(session->evlist, event, file_offset, &sample); dump_event(session->evlist, event, file_offset, &sample, file_path);
return err; return err;
default: default:
return -EINVAL; return -EINVAL;
...@@ -1688,9 +1697,9 @@ int perf_session__deliver_synth_event(struct perf_session *session, ...@@ -1688,9 +1697,9 @@ int perf_session__deliver_synth_event(struct perf_session *session,
events_stats__inc(&evlist->stats, event->header.type); events_stats__inc(&evlist->stats, event->header.type);
if (event->header.type >= PERF_RECORD_USER_TYPE_START) if (event->header.type >= PERF_RECORD_USER_TYPE_START)
return perf_session__process_user_event(session, event, 0); return perf_session__process_user_event(session, event, 0, NULL);
return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0); return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0, NULL);
} }
static void event_swap(union perf_event *event, bool sample_id_all) static void event_swap(union perf_event *event, bool sample_id_all)
...@@ -1787,7 +1796,8 @@ int perf_session__peek_events(struct perf_session *session, u64 offset, ...@@ -1787,7 +1796,8 @@ int perf_session__peek_events(struct perf_session *session, u64 offset,
} }
static s64 perf_session__process_event(struct perf_session *session, static s64 perf_session__process_event(struct perf_session *session,
union perf_event *event, u64 file_offset) union perf_event *event, u64 file_offset,
const char *file_path)
{ {
struct evlist *evlist = session->evlist; struct evlist *evlist = session->evlist;
struct perf_tool *tool = session->tool; struct perf_tool *tool = session->tool;
...@@ -1802,7 +1812,7 @@ static s64 perf_session__process_event(struct perf_session *session, ...@@ -1802,7 +1812,7 @@ static s64 perf_session__process_event(struct perf_session *session,
events_stats__inc(&evlist->stats, event->header.type); events_stats__inc(&evlist->stats, event->header.type);
if (event->header.type >= PERF_RECORD_USER_TYPE_START) if (event->header.type >= PERF_RECORD_USER_TYPE_START)
return perf_session__process_user_event(session, event, file_offset); return perf_session__process_user_event(session, event, file_offset, file_path);
if (tool->ordered_events) { if (tool->ordered_events) {
u64 timestamp = -1ULL; u64 timestamp = -1ULL;
...@@ -1811,12 +1821,12 @@ static s64 perf_session__process_event(struct perf_session *session, ...@@ -1811,12 +1821,12 @@ static s64 perf_session__process_event(struct perf_session *session,
if (ret && ret != -1) if (ret && ret != -1)
return ret; return ret;
ret = perf_session__queue_event(session, event, timestamp, file_offset); ret = perf_session__queue_event(session, event, timestamp, file_offset, file_path);
if (ret != -ETIME) if (ret != -ETIME)
return ret; return ret;
} }
return perf_session__deliver_event(session, event, tool, file_offset); return perf_session__deliver_event(session, event, tool, file_offset, file_path);
} }
void perf_event_header__bswap(struct perf_event_header *hdr) void perf_event_header__bswap(struct perf_event_header *hdr)
...@@ -2043,7 +2053,7 @@ static int __perf_session__process_pipe_events(struct perf_session *session) ...@@ -2043,7 +2053,7 @@ static int __perf_session__process_pipe_events(struct perf_session *session)
} }
} }
if ((skip = perf_session__process_event(session, event, head)) < 0) { if ((skip = perf_session__process_event(session, event, head, "pipe")) < 0) {
pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
head, event->header.size, event->header.type); head, event->header.size, event->header.type);
err = -EINVAL; err = -EINVAL;
...@@ -2140,7 +2150,8 @@ static int __perf_session__process_decomp_events(struct perf_session *session) ...@@ -2140,7 +2150,8 @@ static int __perf_session__process_decomp_events(struct perf_session *session)
size = event->header.size; size = event->header.size;
if (size < sizeof(struct perf_event_header) || if (size < sizeof(struct perf_event_header) ||
(skip = perf_session__process_event(session, event, decomp->file_pos)) < 0) { (skip = perf_session__process_event(session, event, decomp->file_pos,
decomp->file_path)) < 0) {
pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
decomp->file_pos + decomp->head, event->header.size, event->header.type); decomp->file_pos + decomp->head, event->header.size, event->header.type);
return -EINVAL; return -EINVAL;
...@@ -2171,10 +2182,12 @@ struct reader; ...@@ -2171,10 +2182,12 @@ struct reader;
typedef s64 (*reader_cb_t)(struct perf_session *session, typedef s64 (*reader_cb_t)(struct perf_session *session,
union perf_event *event, union perf_event *event,
u64 file_offset); u64 file_offset,
const char *file_path);
struct reader { struct reader {
int fd; int fd;
const char *path;
u64 data_size; u64 data_size;
u64 data_offset; u64 data_offset;
reader_cb_t process; reader_cb_t process;
...@@ -2294,7 +2307,7 @@ reader__read_event(struct reader *rd, struct perf_session *session, ...@@ -2294,7 +2307,7 @@ reader__read_event(struct reader *rd, struct perf_session *session,
skip = -EINVAL; skip = -EINVAL;
if (size < sizeof(struct perf_event_header) || if (size < sizeof(struct perf_event_header) ||
(skip = rd->process(session, event, rd->file_pos)) < 0) { (skip = rd->process(session, event, rd->file_pos, rd->path)) < 0) {
pr_err("%#" PRIx64 " [%#x]: failed to process type: %d [%s]\n", pr_err("%#" PRIx64 " [%#x]: failed to process type: %d [%s]\n",
rd->file_offset + rd->head, event->header.size, rd->file_offset + rd->head, event->header.size,
event->header.type, strerror(-skip)); event->header.type, strerror(-skip));
...@@ -2362,15 +2375,17 @@ reader__process_events(struct reader *rd, struct perf_session *session, ...@@ -2362,15 +2375,17 @@ reader__process_events(struct reader *rd, struct perf_session *session,
static s64 process_simple(struct perf_session *session, static s64 process_simple(struct perf_session *session,
union perf_event *event, union perf_event *event,
u64 file_offset) u64 file_offset,
const char *file_path)
{ {
return perf_session__process_event(session, event, file_offset); return perf_session__process_event(session, event, file_offset, file_path);
} }
static int __perf_session__process_events(struct perf_session *session) static int __perf_session__process_events(struct perf_session *session)
{ {
struct reader rd = { struct reader rd = {
.fd = perf_data__fd(session->data), .fd = perf_data__fd(session->data),
.path = session->data->file.path,
.data_size = session->header.data_size, .data_size = session->header.data_size,
.data_offset = session->header.data_offset, .data_offset = session->header.data_offset,
.process = process_simple, .process = process_simple,
...@@ -2451,6 +2466,7 @@ static int __perf_session__process_dir_events(struct perf_session *session) ...@@ -2451,6 +2466,7 @@ static int __perf_session__process_dir_events(struct perf_session *session)
rd[0] = (struct reader) { rd[0] = (struct reader) {
.fd = perf_data__fd(session->data), .fd = perf_data__fd(session->data),
.path = session->data->file.path,
.data_size = session->header.data_size, .data_size = session->header.data_size,
.data_offset = session->header.data_offset, .data_offset = session->header.data_offset,
.process = process_simple, .process = process_simple,
...@@ -2469,6 +2485,7 @@ static int __perf_session__process_dir_events(struct perf_session *session) ...@@ -2469,6 +2485,7 @@ static int __perf_session__process_dir_events(struct perf_session *session)
continue; continue;
rd[readers] = (struct reader) { rd[readers] = (struct reader) {
.fd = data->dir.files[i].fd, .fd = data->dir.files[i].fd,
.path = data->dir.files[i].path,
.data_size = data->dir.files[i].size, .data_size = data->dir.files[i].size,
.data_offset = 0, .data_offset = 0,
.process = process_simple, .process = process_simple,
......
...@@ -52,6 +52,7 @@ struct perf_session { ...@@ -52,6 +52,7 @@ struct perf_session {
struct decomp { struct decomp {
struct decomp *next; struct decomp *next;
u64 file_pos; u64 file_pos;
const char *file_path;
size_t mmap_len; size_t mmap_len;
u64 head; u64 head;
size_t size; size_t size;
...@@ -87,7 +88,7 @@ int perf_session__peek_events(struct perf_session *session, u64 offset, ...@@ -87,7 +88,7 @@ int perf_session__peek_events(struct perf_session *session, u64 offset,
int perf_session__process_events(struct perf_session *session); int perf_session__process_events(struct perf_session *session);
int perf_session__queue_event(struct perf_session *s, union perf_event *event, int perf_session__queue_event(struct perf_session *s, union perf_event *event,
u64 timestamp, u64 file_offset); u64 timestamp, u64 file_offset, const char *file_path);
void perf_tool__fill_defaults(struct perf_tool *tool); void perf_tool__fill_defaults(struct perf_tool *tool);
......
...@@ -28,7 +28,8 @@ typedef int (*event_attr_op)(struct perf_tool *tool, ...@@ -28,7 +28,8 @@ typedef int (*event_attr_op)(struct perf_tool *tool,
typedef int (*event_op2)(struct perf_session *session, union perf_event *event); typedef int (*event_op2)(struct perf_session *session, union perf_event *event);
typedef s64 (*event_op3)(struct perf_session *session, union perf_event *event); typedef s64 (*event_op3)(struct perf_session *session, union perf_event *event);
typedef int (*event_op4)(struct perf_session *session, union perf_event *event, u64 data); typedef int (*event_op4)(struct perf_session *session, union perf_event *event, u64 data,
const char *str);
typedef int (*event_oe)(struct perf_tool *tool, union perf_event *event, typedef int (*event_oe)(struct perf_tool *tool, union perf_event *event,
struct ordered_events *oe); struct ordered_events *oe);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment