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

Commit 9df9bbba authored by Frederic Weisbecker's avatar Frederic Weisbecker
Browse files

perf: Use generic sample reordering in perf timechart



Use the new generic sample events reordering from perf timechart,
this drops the ad hoc sample reordering it was using before.

Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
parent e0a808c6
Loading
Loading
Loading
Loading
+5 −107
Original line number Diff line number Diff line
@@ -143,9 +143,6 @@ struct wake_event {
static struct power_event    *power_events;
static struct wake_event     *wake_events;

struct sample_wrapper *all_samples;


struct process_filter;
struct process_filter {
	char			*name;
@@ -566,88 +563,6 @@ static void end_sample_processing(void)
	}
}

static u64 sample_time(event_t *event, const struct perf_session *session)
{
	int cursor;

	cursor = 0;
	if (session->sample_type & PERF_SAMPLE_IP)
		cursor++;
	if (session->sample_type & PERF_SAMPLE_TID)
		cursor++;
	if (session->sample_type & PERF_SAMPLE_TIME)
		return event->sample.array[cursor];
	return 0;
}


/*
 * We first queue all events, sorted backwards by insertion.
 * The order will get flipped later.
 */
static int queue_sample_event(event_t *event, struct perf_session *session)
{
	struct sample_wrapper *copy, *prev;
	int size;

	size = event->sample.header.size + sizeof(struct sample_wrapper) + 8;

	copy = malloc(size);
	if (!copy)
		return 1;

	memset(copy, 0, size);

	copy->next = NULL;
	copy->timestamp = sample_time(event, session);

	memcpy(&copy->data, event, event->sample.header.size);

	/* insert in the right place in the list */

	if (!all_samples) {
		/* first sample ever */
		all_samples = copy;
		return 0;
	}

	if (all_samples->timestamp < copy->timestamp) {
		/* insert at the head of the list */
		copy->next = all_samples;
		all_samples = copy;
		return 0;
	}

	prev = all_samples;
	while (prev->next) {
		if (prev->next->timestamp < copy->timestamp) {
			copy->next = prev->next;
			prev->next = copy;
			return 0;
		}
		prev = prev->next;
	}
	/* insert at the end of the list */
	prev->next = copy;

	return 0;
}

static void sort_queued_samples(void)
{
	struct sample_wrapper *cursor, *next;

	cursor = all_samples;
	all_samples = NULL;

	while (cursor) {
		next = cursor->next;
		cursor->next = all_samples;
		all_samples = cursor;
		cursor = next;
	}
}

/*
 * Sort the pid datastructure
 */
@@ -1011,26 +926,12 @@ static void write_svg_file(const char *filename)
	svg_close();
}

static void process_samples(struct perf_session *session)
{
	struct sample_wrapper *cursor;
	event_t *event;

	sort_queued_samples();

	cursor = all_samples;
	while (cursor) {
		event = (void *)&cursor->data;
		cursor = cursor->next;
		process_sample_event(event, session);
	}
}

static struct perf_event_ops event_ops = {
	.comm			= process_comm_event,
	.fork			= process_fork_event,
	.exit			= process_exit_event,
	.sample	= queue_sample_event,
	.sample			= process_sample_event,
	.ordered_samples	= true,
};

static int __cmd_timechart(void)
@@ -1048,8 +949,6 @@ static int __cmd_timechart(void)
	if (ret)
		goto out_delete;

	process_samples(session);

	end_sample_processing();

	sort_pids();
@@ -1072,7 +971,6 @@ static const char *record_args[] = {
	"record",
	"-a",
	"-R",
	"-M",
	"-f",
	"-c", "1",
	"-e", "power:power_start",