Commit b491198d authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

perf tools: Do not seek in pipe fd during tracing data processing

There's no need to set 'fd' position in pipe mode, the file descriptor
is already in proper place. Moreover the lseek will fail on pipe
descriptor and that's why it's been working properly.

I was tempted to remove the lseek calls completely, because it seems
that tracing data event was always synthesized only in pipe mode, so
there's no need for 'file' mode handling. But I guess there was a reason
behind this and there might (however unlikely) be a perf.data that we
could break processing for.
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Khuong <pvk@pvk.ca>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20200507095024.2789147-3-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent fdb071f8
......@@ -3947,12 +3947,22 @@ int perf_event__process_tracing_data(struct perf_session *session,
{
ssize_t size_read, padding, size = event->tracing_data.size;
int fd = perf_data__fd(session->data);
off_t offset = lseek(fd, 0, SEEK_CUR);
char buf[BUFSIZ];
/*
* The pipe fd is already in proper place and in any case
* we can't move it, and we'd screw the case where we read
* 'pipe' data from regular file. The trace_report reads
* data from 'fd' so we need to set it directly behind the
* event, where the tracing data starts.
*/
if (!perf_data__is_pipe(session->data)) {
off_t offset = lseek(fd, 0, SEEK_CUR);
/* setup for reading amidst mmap */
lseek(fd, offset + sizeof(struct perf_record_header_tracing_data),
SEEK_SET);
}
size_read = trace_report(fd, &session->tevent,
session->repipe);
......
......@@ -1542,7 +1542,12 @@ static s64 perf_session__process_user_event(struct perf_session *session,
*/
return 0;
case PERF_RECORD_HEADER_TRACING_DATA:
/* setup for reading amidst mmap */
/*
* Setup for reading amidst mmap, but only when we
* are in 'file' mode. The 'pipe' fd is in proper
* place already.
*/
if (!perf_data__is_pipe(session->data))
lseek(fd, file_offset, SEEK_SET);
return tool->tracing_data(session, event);
case PERF_RECORD_HEADER_BUILD_ID:
......
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