Print path and name of a data file into raw dump (-D)
<file_offset>@<path/file>. Print offset of PERF_RECORD_COMPRESSED
record instead of zero for decompressed records:
  0x22...@perf.data [0x30]: event: 9
or
  0x15c...@perf.data/data.7 [0x30]: event: 9

Acked-by: Namhyung Kim <namhy...@kernel.org>
Signed-off-by: Alexey Budankov <alexey.budan...@linux.intel.com>
---
 tools/perf/builtin-inject.c      |  3 +-
 tools/perf/util/ordered-events.h |  1 +
 tools/perf/util/session.c        | 77 +++++++++++++++++++-------------
 tools/perf/util/session.h        |  1 +
 tools/perf/util/tool.h           |  3 +-
 5 files changed, 52 insertions(+), 33 deletions(-)

diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index 452a75fe68e5..037f8a98220c 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -106,7 +106,8 @@ static int perf_event__repipe_op2_synth(struct perf_session 
*session,
 
 static int perf_event__repipe_op4_synth(struct perf_session *session,
                                        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);
 }
diff --git a/tools/perf/util/ordered-events.h b/tools/perf/util/ordered-events.h
index 75345946c4b9..42c9764c6b5b 100644
--- a/tools/perf/util/ordered-events.h
+++ b/tools/perf/util/ordered-events.h
@@ -9,6 +9,7 @@ struct perf_sample;
 struct ordered_event {
        u64                     timestamp;
        u64                     file_offset;
+       const char              *file_path;
        union perf_event        *event;
        struct list_head        list;
 };
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 098080287c68..3c2fafb3a04d 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -36,7 +36,8 @@
 
 #ifdef HAVE_ZSTD_SUPPORT
 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;
        size_t decomp_size, src_size;
@@ -58,6 +59,7 @@ static int perf_session__process_compressed_event(struct 
perf_session *session,
        }
 
        decomp->file_pos = file_offset;
+       decomp->file_path = file_path;
        decomp->mmap_len = mmap_len;
        decomp->head = 0;
 
@@ -98,7 +100,8 @@ static int perf_session__process_compressed_event(struct 
perf_session *session,
 static int perf_session__deliver_event(struct perf_session *session,
                                       union perf_event *event,
                                       struct perf_tool *tool,
-                                      u64 file_offset);
+                                      u64 file_offset,
+                                      const char *file_path);
 
 static int perf_session__open(struct perf_session *session)
 {
@@ -180,7 +183,8 @@ static int ordered_events__deliver_event(struct 
ordered_events *oe,
                                                    ordered_events);
 
        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,
@@ -452,7 +456,8 @@ static int process_stat_round_stub(struct perf_session 
*perf_session __maybe_unu
 
 static int perf_session__process_compressed_event_stub(struct perf_session 
*session __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");
        return 0;
@@ -1241,13 +1246,14 @@ static void sample_read__printf(struct perf_sample 
*sample, u64 read_format)
 }
 
 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)
                return;
 
-       printf("\n%#" PRIx64 " [%#x]: event: %d\n",
-              file_offset, event->header.size, event->header.type);
+       printf("\n%#" PRIx64 "@%s [%#x]: event: %d\n",
+              file_offset, file_path, event->header.size, event->header.type);
 
        trace_event(event);
        if (event->header.type == PERF_RECORD_SAMPLE && 
evlist->trace_event_sample_raw)
@@ -1438,12 +1444,13 @@ static int machines__deliver_event(struct machines 
*machines,
                                   struct evlist *evlist,
                                   union perf_event *event,
                                   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 machine *machine;
 
-       dump_event(evlist, event, file_offset, sample);
+       dump_event(evlist, event, file_offset, sample, file_path);
 
        evsel = perf_evlist__id2evsel(evlist, sample->id);
 
@@ -1520,7 +1527,8 @@ static int machines__deliver_event(struct machines 
*machines,
 static int perf_session__deliver_event(struct perf_session *session,
                                       union perf_event *event,
                                       struct perf_tool *tool,
-                                      u64 file_offset)
+                                      u64 file_offset,
+                                      const char *file_path)
 {
        struct perf_sample sample;
        int ret;
@@ -1538,7 +1546,7 @@ static int perf_session__deliver_event(struct 
perf_session *session,
                return 0;
 
        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)
                auxtrace__dump_auxtrace_sample(session, &sample);
@@ -1548,7 +1556,8 @@ static int perf_session__deliver_event(struct 
perf_session *session,
 
 static s64 perf_session__process_user_event(struct perf_session *session,
                                            union perf_event *event,
-                                           u64 file_offset)
+                                           u64 file_offset,
+                                           const char *file_path)
 {
        struct ordered_events *oe = &session->ordered_events;
        struct perf_tool *tool = session->tool;
@@ -1558,7 +1567,7 @@ static s64 perf_session__process_user_event(struct 
perf_session *session,
 
        if (event->header.type != PERF_RECORD_COMPRESSED ||
            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 */
        switch (event->header.type) {
@@ -1617,9 +1626,9 @@ static s64 perf_session__process_user_event(struct 
perf_session *session,
        case PERF_RECORD_HEADER_FEATURE:
                return tool->feature(session, event);
        case PERF_RECORD_COMPRESSED:
-               err = tool->compressed(session, event, file_offset);
+               err = tool->compressed(session, event, file_offset, file_path);
                if (err)
-                       dump_event(session->evlist, event, file_offset, 
&sample);
+                       dump_event(session->evlist, event, file_offset, 
&sample, file_path);
                return err;
        default:
                return -EINVAL;
@@ -1636,9 +1645,9 @@ int perf_session__deliver_synth_event(struct perf_session 
*session,
        events_stats__inc(&evlist->stats, event->header.type);
 
        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)
@@ -1734,7 +1743,8 @@ int perf_session__peek_events(struct perf_session 
*session, u64 offset,
 }
 
 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 perf_tool *tool = session->tool;
@@ -1749,7 +1759,7 @@ static s64 perf_session__process_event(struct 
perf_session *session,
        events_stats__inc(&evlist->stats, event->header.type);
 
        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) {
                u64 timestamp = -1ULL;
@@ -1763,7 +1773,7 @@ static s64 perf_session__process_event(struct 
perf_session *session,
                        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)
@@ -2001,7 +2011,8 @@ static int __perf_session__process_pipe_events(struct 
perf_session *session)
                }
        }
 
-       if ((skip = perf_session__process_event(session, event, head)) < 0) {
+       skip = perf_session__process_event(session, event, head, "pipe");
+       if (skip < 0) {
                pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
                       head, event->header.size, event->header.type);
                err = -EINVAL;
@@ -2082,7 +2093,7 @@ fetch_decomp_event(u64 head, size_t mmap_size, char *buf, 
bool needs_swap)
 static int __perf_session__process_decomp_events(struct perf_session *session)
 {
        s64 skip;
-       u64 size, file_pos = 0;
+       u64 size;
        struct decomp *decomp = session->decomp_last;
 
        if (!decomp)
@@ -2096,9 +2107,9 @@ static int __perf_session__process_decomp_events(struct 
perf_session *session)
                        break;
 
                size = event->header.size;
-
-               if (size < sizeof(struct perf_event_header) ||
-                   (skip = perf_session__process_event(session, event, 
file_pos)) < 0) {
+               skip = perf_session__process_event(session, event, 
decomp->file_pos,
+                                                  decomp->file_path);
+               if (size < sizeof(struct perf_event_header) || skip < 0) {
                        pr_err("%#" PRIx64 " [%#x]: failed to process type: 
%d\n",
                                decomp->file_pos + decomp->head, 
event->header.size, event->header.type);
                        return -EINVAL;
@@ -2129,10 +2140,12 @@ struct reader;
 
 typedef s64 (*reader_cb_t)(struct perf_session *session,
                           union perf_event *event,
-                          u64 file_offset);
+                          u64 file_offset,
+                          const char *file_path);
 
 struct reader {
        int              fd;
+       const char       *path;
        u64              data_size;
        u64              data_offset;
        reader_cb_t      process;
@@ -2211,9 +2224,9 @@ reader__process_events(struct reader *rd, struct 
perf_session *session,
        skip = -EINVAL;
 
        if (size < sizeof(struct perf_event_header) ||
-           (skip = rd->process(session, event, file_pos)) < 0) {
-               pr_err("%#" PRIx64 " [%#x]: failed to process type: %d [%s]\n",
-                      file_offset + head, event->header.size,
+           (skip = rd->process(session, event, file_pos, rd->path)) < 0) {
+               pr_err("%#" PRIx64 " [%s] [%#x]: failed to process type: %d 
[%s]\n",
+                      file_offset + head, rd->path, event->header.size,
                       event->header.type, strerror(-skip));
                err = skip;
                goto out;
@@ -2243,9 +2256,10 @@ reader__process_events(struct reader *rd, struct 
perf_session *session,
 
 static s64 process_simple(struct perf_session *session,
                          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)
@@ -2255,6 +2269,7 @@ static int __perf_session__process_events(struct 
perf_session *session)
                .data_size      = session->header.data_size,
                .data_offset    = session->header.data_offset,
                .process        = process_simple,
+               .path           = session->data->file.path,
        };
        struct ordered_events *oe = &session->ordered_events;
        struct perf_tool *tool = session->tool;
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index f76480166d38..378ffc3e2809 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -46,6 +46,7 @@ struct perf_session {
 struct decomp {
        struct decomp *next;
        u64 file_pos;
+       const char *file_path;
        size_t mmap_len;
        u64 head;
        size_t size;
diff --git a/tools/perf/util/tool.h b/tools/perf/util/tool.h
index bbbc0dcd461f..c966531d3eca 100644
--- a/tools/perf/util/tool.h
+++ b/tools/perf/util/tool.h
@@ -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 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,
                        struct ordered_events *oe);
-- 
2.24.1

Reply via email to