perf session: Fix infinite loop on invalid perf.data file
perf-record updates the header in the perf.data file at termination. Without this update perf-report (and other processing built-ins) it caused an infinite loop when perf report (or something like) called. This is because the algorithm in __perf_session__process_events() depends on the data_size which is read from file header. Use file size directly instead in this case to do the best-effort processing. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Tested-by: David Ahern <dsahern@gmail.com> Tested-by: Sonny Rao <sonnyrao@chromium.org> Acked-by: Ingo Molnar <mingo@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Sonny Rao <sonnyrao@chromium.org> Link: http://lkml.kernel.org/r/1380529188-27193-1-git-send-email-namhyung@kernel.org Signed-off-by: David Ahern <dsahern@gmail.com> [ Reworded warning as per Ingo Molnar suggestion, replaces 'perf.data' with session->filename, to precisely identify the data file involved ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:

committed by
Arnaldo Carvalho de Melo

parent
027a7e86a1
commit
b314e5cfd1
@@ -1312,7 +1312,7 @@ int __perf_session__process_events(struct perf_session *session,
|
||||
file_offset = page_offset;
|
||||
head = data_offset - page_offset;
|
||||
|
||||
if (data_offset + data_size < file_size)
|
||||
if (data_size && (data_offset + data_size < file_size))
|
||||
file_size = data_offset + data_size;
|
||||
|
||||
progress_next = file_size / 16;
|
||||
|
Reference in New Issue
Block a user