mirror of https://gitee.com/openkylin/linux.git
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: 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>
This commit is contained in:
parent
ff1a70e75f
commit
d25380cd3b
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue