]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
perf session: Add facility to peek at all events
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 15 Nov 2019 12:42:20 +0000 (14:42 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 22 Nov 2019 13:48:13 +0000 (10:48 -0300)
AUX area samples are not limited in how far back in time the sample
could start. Consequently samples must be queued in advance to allow for
time-ordered processing. To achieve that, add
perf_session__peek_events() that walks and peeks at all the events.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: http://lore.kernel.org/lkml/20191115124225.5247-11-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/session.c
tools/perf/util/session.h

index ab4dae1efea3eb68745e5694f63fae545f168d33..d0d7d25b23e3b049fc708132d7ff989117b71b9d 100644 (file)
@@ -1659,6 +1659,34 @@ int perf_session__peek_event(struct perf_session *session, off_t file_offset,
        return 0;
 }
 
+int perf_session__peek_events(struct perf_session *session, u64 offset,
+                             u64 size, peek_events_cb_t cb, void *data)
+{
+       u64 max_offset = offset + size;
+       char buf[PERF_SAMPLE_MAX_SIZE];
+       union perf_event *event;
+       int err;
+
+       do {
+               err = perf_session__peek_event(session, offset, buf,
+                                              PERF_SAMPLE_MAX_SIZE, &event,
+                                              NULL);
+               if (err)
+                       return err;
+
+               err = cb(session, event, offset, data);
+               if (err)
+                       return err;
+
+               offset += event->header.size;
+               if (event->header.type == PERF_RECORD_AUXTRACE)
+                       offset += event->auxtrace.size;
+
+       } while (offset < max_offset);
+
+       return err;
+}
+
 static s64 perf_session__process_event(struct perf_session *session,
                                       union perf_event *event, u64 file_offset)
 {
index 8456e1d868fda07f7492a5368f0c440b310d62f8..f76480166d38e5cf66bd6ea3c6ae1ad2ffa4b878 100644 (file)
@@ -64,6 +64,11 @@ int perf_session__peek_event(struct perf_session *session, off_t file_offset,
                             void *buf, size_t buf_sz,
                             union perf_event **event_ptr,
                             struct perf_sample *sample);
+typedef int (*peek_events_cb_t)(struct perf_session *session,
+                               union perf_event *event, u64 offset,
+                               void *data);
+int perf_session__peek_events(struct perf_session *session, u64 offset,
+                             u64 size, peek_events_cb_t cb, void *data);
 
 int perf_session__process_events(struct perf_session *session);