|
@@ -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);
|