Commit d25380cd authored by David Ahern's avatar David Ahern Committed by Arnaldo Carvalho de Melo

perf session: flush_sample_queue needs to handle errors from handlers

Allows errors to propogate through event processing code and back to
commands.
Signed-off-by: default avatarDavid 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.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ff1a70e7
...@@ -692,7 +692,7 @@ static int perf_session_deliver_event(struct perf_session *session, ...@@ -692,7 +692,7 @@ static int perf_session_deliver_event(struct perf_session *session,
struct perf_tool *tool, struct perf_tool *tool,
u64 file_offset); 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 perf_tool *tool)
{ {
struct ordered_samples *os = &s->ordered_samples; struct ordered_samples *os = &s->ordered_samples;
...@@ -705,7 +705,7 @@ static void flush_sample_queue(struct perf_session *s, ...@@ -705,7 +705,7 @@ static void flush_sample_queue(struct perf_session *s,
int ret; int ret;
if (!tool->ordered_samples || !limit) if (!tool->ordered_samples || !limit)
return; return 0;
list_for_each_entry_safe(iter, tmp, head, list) { list_for_each_entry_safe(iter, tmp, head, list) {
if (iter->timestamp > limit) if (iter->timestamp > limit)
...@@ -715,9 +715,12 @@ static void flush_sample_queue(struct perf_session *s, ...@@ -715,9 +715,12 @@ static void flush_sample_queue(struct perf_session *s,
s->header.needs_swap); s->header.needs_swap);
if (ret) if (ret)
pr_err("Can't parse sample, err = %d\n", ret); pr_err("Can't parse sample, err = %d\n", ret);
else else {
perf_session_deliver_event(s, iter->event, &sample, tool, ret = perf_session_deliver_event(s, iter->event, &sample, tool,
iter->file_offset); iter->file_offset);
if (ret)
return ret;
}
os->last_flush = iter->timestamp; os->last_flush = iter->timestamp;
list_del(&iter->list); list_del(&iter->list);
...@@ -737,6 +740,8 @@ static void flush_sample_queue(struct perf_session *s, ...@@ -737,6 +740,8 @@ static void flush_sample_queue(struct perf_session *s,
} }
os->nr_samples = 0; os->nr_samples = 0;
return 0;
} }
/* /*
...@@ -782,10 +787,11 @@ static int process_finished_round(struct perf_tool *tool, ...@@ -782,10 +787,11 @@ static int process_finished_round(struct perf_tool *tool,
union perf_event *event __used, union perf_event *event __used,
struct perf_session *session) struct perf_session *session)
{ {
flush_sample_queue(session, tool); int ret = flush_sample_queue(session, tool);
session->ordered_samples.next_flush = session->ordered_samples.max_timestamp; if (!ret)
session->ordered_samples.next_flush = session->ordered_samples.max_timestamp;
return 0; return ret;
} }
/* The queue is ordered by time */ /* The queue is ordered by time */
...@@ -1443,7 +1449,7 @@ int __perf_session__process_events(struct perf_session *session, ...@@ -1443,7 +1449,7 @@ int __perf_session__process_events(struct perf_session *session,
err = 0; err = 0;
/* do the final flush for ordered samples */ /* do the final flush for ordered samples */
session->ordered_samples.next_flush = ULLONG_MAX; session->ordered_samples.next_flush = ULLONG_MAX;
flush_sample_queue(session, tool); err = flush_sample_queue(session, tool);
out_err: out_err:
perf_session__warn_about_errors(session, tool); perf_session__warn_about_errors(session, tool);
perf_session_free_sample_buffers(session); perf_session_free_sample_buffers(session);
......
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