Skip to content

Commit

Permalink
perf report: More robust error handling
Browse files Browse the repository at this point in the history
Don't let funny events confuse us, stick to what we know and
try to find sensible data again.

If we find an unknown event, check we're still u64 aligned, and
increment by one u64. This ensures we're bound to happen upon a
valid event soon.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: John Kacur <jkacur@redhat.com>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed May 26, 2009
1 parent f49515b commit 6142f9e
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions Documentation/perf_counter/builtin-report.c
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,7 @@ static int __cmd_report(void)
char *buf;
event_t *event;
int ret, rc = EXIT_FAILURE;
uint32_t size;
unsigned long total = 0, total_mmap = 0, total_comm = 0, total_unknown = 0;

input = open(input_name, O_RDONLY);
Expand Down Expand Up @@ -680,6 +681,10 @@ static int __cmd_report(void)
more:
event = (event_t *)(buf + head);

size = event->header.size;
if (!size)
size = 8;

if (head + event->header.size >= page_size * mmap_window) {
unsigned long shift = page_size * (head / page_size);
int ret;
Expand All @@ -692,12 +697,9 @@ static int __cmd_report(void)
goto remap;
}


if (!event->header.size) {
fprintf(stderr, "zero-sized event at file offset %ld\n", offset + head);
fprintf(stderr, "skipping %ld bytes of events.\n", stat.st_size - offset - head);
goto done;
}
size = event->header.size;
if (!size)
goto broken_event;

if (event->header.misc & PERF_EVENT_MISC_OVERFLOW) {
char level;
Expand Down Expand Up @@ -787,15 +789,26 @@ static int __cmd_report(void)
break;
}
default: {
broken_event:
fprintf(stderr, "%p [%p]: skipping unknown header type: %d\n",
(void *)(offset + head),
(void *)(long)(event->header.size),
event->header.type);
total_unknown++;

/*
* assume we lost track of the stream, check alignment, and
* increment a single u64 in the hope to catch on again 'soon'.
*/

if (unlikely(head & 7))
head &= ~7ULL;

size = 8;
}
}

head += event->header.size;
head += size;

if (offset + head < stat.st_size)
goto more;
Expand Down

0 comments on commit 6142f9e

Please sign in to comment.