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,
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 @@ int __perf_session__process_events(struct perf_session *session,
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);
......
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