Commit 0807d2d8 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf evsel: Know if byte swap is needed

Instead of passing it around for parsing as an explicit parameter, will
help with reading tracepoint fields when not using a perf session or
pevent structure, i.e. for non perf.data centered workflows.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-qa67ikv2sm49cwa7dyjhhp6g@git.kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a14bb7a6
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -564,7 +564,7 @@ static int test__basic_mmap(void)
			goto out_munmap;
			goto out_munmap;
		}
		}


		err = perf_evlist__parse_sample(evlist, event, &sample, false);
		err = perf_evlist__parse_sample(evlist, event, &sample);
		if (err) {
		if (err) {
			pr_err("Can't parse sample, err = %d\n", err);
			pr_err("Can't parse sample, err = %d\n", err);
			goto out_munmap;
			goto out_munmap;
@@ -781,7 +781,7 @@ static int test__PERF_RECORD(void)
				if (type < PERF_RECORD_MAX)
				if (type < PERF_RECORD_MAX)
					nr_events[type]++;
					nr_events[type]++;


				err = perf_evlist__parse_sample(evlist, event, &sample, false);
				err = perf_evlist__parse_sample(evlist, event, &sample);
				if (err < 0) {
				if (err < 0) {
					if (verbose)
					if (verbose)
						perf_event__fprintf(event, stderr);
						perf_event__fprintf(event, stderr);
+1 −1
Original line number Original line Diff line number Diff line
@@ -823,7 +823,7 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
	int ret;
	int ret;


	while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) {
	while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) {
		ret = perf_evlist__parse_sample(top->evlist, event, &sample, false);
		ret = perf_evlist__parse_sample(top->evlist, event, &sample);
		if (ret) {
		if (ret) {
			pr_err("Can't parse sample, err = %d\n", ret);
			pr_err("Can't parse sample, err = %d\n", ret);
			continue;
			continue;
+2 −2
Original line number Original line Diff line number Diff line
@@ -884,10 +884,10 @@ int perf_evlist__start_workload(struct perf_evlist *evlist)
}
}


int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
			      struct perf_sample *sample, bool swapped)
			      struct perf_sample *sample)
{
{
	struct perf_evsel *evsel = perf_evlist__first(evlist);
	struct perf_evsel *evsel = perf_evlist__first(evlist);
	return perf_evsel__parse_sample(evsel, event, sample, swapped);
	return perf_evsel__parse_sample(evsel, event, sample);
}
}


size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
+1 −1
Original line number Original line Diff line number Diff line
@@ -125,7 +125,7 @@ bool perf_evlist__sample_id_all(struct perf_evlist *evlist);
u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);


int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
			      struct perf_sample *sample, bool swapped);
			      struct perf_sample *sample);


bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
+8 −5
Original line number Original line Diff line number Diff line
@@ -767,11 +767,13 @@ int perf_evsel__open_per_thread(struct perf_evsel *evsel,
	return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
	return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
}
}


static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
				       struct perf_sample *sample,
				       const union perf_event *event,
				       bool swapped)
				       struct perf_sample *sample)
{
{
	u64 type = evsel->attr.sample_type;
	const u64 *array = event->sample.array;
	const u64 *array = event->sample.array;
	bool swapped = evsel->needs_swap;
	union u64_swap u;
	union u64_swap u;


	array += ((event->header.size -
	array += ((event->header.size -
@@ -832,10 +834,11 @@ static bool sample_overlap(const union perf_event *event,
}
}


int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
			     struct perf_sample *data, bool swapped)
			     struct perf_sample *data)
{
{
	u64 type = evsel->attr.sample_type;
	u64 type = evsel->attr.sample_type;
	u64 regs_user = evsel->attr.sample_regs_user;
	u64 regs_user = evsel->attr.sample_regs_user;
	bool swapped = evsel->needs_swap;
	const u64 *array;
	const u64 *array;


	/*
	/*
@@ -852,7 +855,7 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
	if (event->header.type != PERF_RECORD_SAMPLE) {
	if (event->header.type != PERF_RECORD_SAMPLE) {
		if (!evsel->attr.sample_id_all)
		if (!evsel->attr.sample_id_all)
			return 0;
			return 0;
		return perf_event__parse_id_sample(event, type, data, swapped);
		return perf_evsel__parse_id_sample(evsel, event, data);
	}
	}


	array = event->sample.array;
	array = event->sample.array;
Loading