perf session: flush_sample_queue needs to handle errors from handlers
authorDavid Ahern <dsahern@gmail.com>
Sun, 26 Aug 2012 18:24:41 +0000 (12:24 -0600)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 5 Sep 2012 20:17:30 +0000 (17:17 -0300)
Allows errors to propogate through event processing code and back to
commands.

Signed-off-by: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1346005487-62961-2-git-send-email-dsahern@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/session.c

index f7bb7ae..9453758 100644 (file)
@@ -692,7 +692,7 @@ static int perf_session_deliver_event(struct perf_session *session,
                                      struct perf_tool *tool,
                                      u64 file_offset);
 
-static void flush_sample_queue(struct perf_session *s,
+static int flush_sample_queue(struct perf_session *s,
                               struct perf_tool *tool)
 {
        struct ordered_samples *os = &s->ordered_samples;
@@ -705,7 +705,7 @@ static void flush_sample_queue(struct perf_session *s,
        int ret;
 
        if (!tool->ordered_samples || !limit)
-               return;
+               return 0;
 
        list_for_each_entry_safe(iter, tmp, head, list) {
                if (iter->timestamp > limit)
@@ -715,9 +715,12 @@ static void flush_sample_queue(struct perf_session *s,
                                                s->header.needs_swap);
                if (ret)
                        pr_err("Can't parse sample, err = %d\n", ret);
-               else
-                       perf_session_deliver_event(s, iter->event, &sample, tool,
-                                                  iter->file_offset);
+               else {
+                       ret = perf_session_deliver_event(s, iter->event, &sample, tool,
+                                                        iter->file_offset);
+                       if (ret)
+                               return ret;
+               }
 
                os->last_flush = iter->timestamp;
                list_del(&iter->list);
@@ -737,6 +740,8 @@ static void flush_sample_queue(struct perf_session *s,
        }
 
        os->nr_samples = 0;
+
+       return 0;
 }
 
 /*
@@ -782,10 +787,11 @@ static int process_finished_round(struct perf_tool *tool,
                                  union perf_event *event __used,
                                  struct perf_session *session)
 {
-       flush_sample_queue(session, tool);
-       session->ordered_samples.next_flush = session->ordered_samples.max_timestamp;
+       int ret = flush_sample_queue(session, tool);
+       if (!ret)
+               session->ordered_samples.next_flush = session->ordered_samples.max_timestamp;
 
-       return 0;
+       return ret;
 }
 
 /* The queue is ordered by time */
@@ -1443,7 +1449,7 @@ more:
        err = 0;
        /* do the final flush for ordered samples */
        session->ordered_samples.next_flush = ULLONG_MAX;
-       flush_sample_queue(session, tool);
+       err = flush_sample_queue(session, tool);
 out_err:
        perf_session__warn_about_errors(session, tool);
        perf_session_free_sample_buffers(session);