perf/live-mode: Handle payload-less events
authorTom Zanussi <tzanussi@gmail.com>
Wed, 5 May 2010 05:27:40 +0000 (00:27 -0500)
committerFrederic Weisbecker <fweisbec@gmail.com>
Sun, 9 May 2010 11:49:52 +0000 (13:49 +0200)
Some events, such as the PERF_RECORD_FINISHED_ROUND event consist of
only an event header and no data.  In this case, a 0-length payload
will be read, and the 0 return value will be wrongly interpreted as an
'unexpected end of event stream'.

This patch allows for proper handling of data-less events by skipping
0-length reads.

Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
LKML-Reference: <1273038527.6383.51.camel@tropicana>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
tools/perf/util/session.c

index 9401909..00ab298 100644 (file)
@@ -696,15 +696,18 @@ more:
        p = &event;
        p += sizeof(struct perf_event_header);
 
-       err = do_read(self->fd, p, size - sizeof(struct perf_event_header));
-       if (err <= 0) {
-               if (err == 0) {
-                       pr_err("unexpected end of event stream\n");
-                       goto done;
-               }
+       if (size - sizeof(struct perf_event_header)) {
+               err = do_read(self->fd, p,
+                             size - sizeof(struct perf_event_header));
+               if (err <= 0) {
+                       if (err == 0) {
+                               pr_err("unexpected end of event stream\n");
+                               goto done;
+                       }
 
-               pr_err("failed to read event data\n");
-               goto out_err;
+                       pr_err("failed to read event data\n");
+                       goto out_err;
+               }
        }
 
        if (size == 0 ||