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,
|
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,
|
||||||
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,
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
os->nr_samples = 0;
|
os->nr_samples = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue