Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d25380cd authored by David Ahern's avatar David Ahern Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarDavid 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ff1a70e7
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -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,
		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);
	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);