[PATCH 1/7] perf tool: 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 Cc: Ingo Molnar Cc: Frederic Weisbecker Cc: Peter Zijlstra --- tools/perf/util/session.c | 24 +++- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index f7bb7ae..9453758 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -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 = >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, , tool, - iter->file_offset); + else { + ret = perf_session_deliver_event(s, iter->event, , tool, +iter->file_offset); + if (ret) + return ret; + } os->last_flush = iter->timestamp; list_del(>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 @@ more: 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); -- 1.7.10.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 1/7] perf tool: 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 dsah...@gmail.com Cc: Ingo Molnar mi...@kernel.org Cc: Frederic Weisbecker fweis...@gmail.com Cc: Peter Zijlstra pet...@infradead.org --- tools/perf/util/session.c | 24 +++- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index f7bb7ae..9453758 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -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 @@ more: 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); -- 1.7.10.1 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/