Skip to content

Commit

Permalink
perf session: flush_sample_queue needs to handle errors from handlers
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Ahern authored and Arnaldo Carvalho de Melo committed Sep 5, 2012
1 parent ff1a70e commit d25380c
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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);
Expand All @@ -737,6 +740,8 @@ static void flush_sample_queue(struct perf_session *s,
}

os->nr_samples = 0;

return 0;
}

/*
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit d25380c

Please sign in to comment.