aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2012-09-26 11:48:18 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2012-09-26 11:48:18 -0400
commit0807d2d8a381f4fc600ad481c3e77e5cdb624eed (patch)
tree3cd46552cea3e1a9c7c872250f790cb180f6cccf /tools/perf/util
parenta14bb7a6fd4a3d563ca971daf462ba4dc294a7a6 (diff)
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: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util')
-rw-r--r--tools/perf/util/evlist.c4
-rw-r--r--tools/perf/util/evlist.h2
-rw-r--r--tools/perf/util/evsel.c13
-rw-r--r--tools/perf/util/evsel.h3
-rw-r--r--tools/perf/util/header.c6
-rw-r--r--tools/perf/util/python.c2
-rw-r--r--tools/perf/util/session.c6
7 files changed, 21 insertions, 15 deletions
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index 27f6de3aab16..704bd91ce05d 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -884,10 +884,10 @@ int perf_evlist__start_workload(struct perf_evlist *evlist)
884} 884}
885 885
886int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event, 886int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
887 struct perf_sample *sample, bool swapped) 887 struct perf_sample *sample)
888{ 888{
889 struct perf_evsel *evsel = perf_evlist__first(evlist); 889 struct perf_evsel *evsel = perf_evlist__first(evlist);
890 return perf_evsel__parse_sample(evsel, event, sample, swapped); 890 return perf_evsel__parse_sample(evsel, event, sample);
891} 891}
892 892
893size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp) 893size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 3f2e1e4ccdd5..008a95702bf7 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -125,7 +125,7 @@ bool perf_evlist__sample_id_all(struct perf_evlist *evlist);
125u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist); 125u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
126 126
127int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event, 127int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
128 struct perf_sample *sample, bool swapped); 128 struct perf_sample *sample);
129 129
130bool perf_evlist__valid_sample_type(struct perf_evlist *evlist); 130bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
131bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist); 131bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 2467eaf2968f..fe9581b0323c 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -767,11 +767,13 @@ int perf_evsel__open_per_thread(struct perf_evsel *evsel,
767 return __perf_evsel__open(evsel, &empty_cpu_map.map, threads); 767 return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
768} 768}
769 769
770static int perf_event__parse_id_sample(const union perf_event *event, u64 type, 770static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
771 struct perf_sample *sample, 771 const union perf_event *event,
772 bool swapped) 772 struct perf_sample *sample)
773{ 773{
774 u64 type = evsel->attr.sample_type;
774 const u64 *array = event->sample.array; 775 const u64 *array = event->sample.array;
776 bool swapped = evsel->needs_swap;
775 union u64_swap u; 777 union u64_swap u;
776 778
777 array += ((event->header.size - 779 array += ((event->header.size -
@@ -832,10 +834,11 @@ static bool sample_overlap(const union perf_event *event,
832} 834}
833 835
834int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event, 836int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
835 struct perf_sample *data, bool swapped) 837 struct perf_sample *data)
836{ 838{
837 u64 type = evsel->attr.sample_type; 839 u64 type = evsel->attr.sample_type;
838 u64 regs_user = evsel->attr.sample_regs_user; 840 u64 regs_user = evsel->attr.sample_regs_user;
841 bool swapped = evsel->needs_swap;
839 const u64 *array; 842 const u64 *array;
840 843
841 /* 844 /*
@@ -852,7 +855,7 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
852 if (event->header.type != PERF_RECORD_SAMPLE) { 855 if (event->header.type != PERF_RECORD_SAMPLE) {
853 if (!evsel->attr.sample_id_all) 856 if (!evsel->attr.sample_id_all)
854 return 0; 857 return 0;
855 return perf_event__parse_id_sample(event, type, data, swapped); 858 return perf_evsel__parse_id_sample(evsel, event, data);
856 } 859 }
857 860
858 array = event->sample.array; 861 array = event->sample.array;
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h
index bb445d1cbc7b..60d28853748e 100644
--- a/tools/perf/util/evsel.h
+++ b/tools/perf/util/evsel.h
@@ -69,6 +69,7 @@ struct perf_evsel {
69 struct cpu_map *cpus; 69 struct cpu_map *cpus;
70 unsigned int sample_size; 70 unsigned int sample_size;
71 bool supported; 71 bool supported;
72 bool needs_swap;
72 /* parse modifier helper */ 73 /* parse modifier helper */
73 int exclude_GH; 74 int exclude_GH;
74 struct perf_evsel *leader; 75 struct perf_evsel *leader;
@@ -205,7 +206,7 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel,
205void hists__init(struct hists *hists); 206void hists__init(struct hists *hists);
206 207
207int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event, 208int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
208 struct perf_sample *sample, bool swapped); 209 struct perf_sample *sample);
209 210
210static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel) 211static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel)
211{ 212{
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 6aae3290358e..7daad237dea5 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1256,8 +1256,10 @@ read_event_desc(struct perf_header *ph, int fd)
1256 if (ret != (ssize_t)sizeof(nr)) 1256 if (ret != (ssize_t)sizeof(nr))
1257 goto error; 1257 goto error;
1258 1258
1259 if (ph->needs_swap) 1259 if (ph->needs_swap) {
1260 nr = bswap_32(nr); 1260 nr = bswap_32(nr);
1261 evsel->needs_swap = true;
1262 }
1261 1263
1262 evsel->name = do_read_string(fd, ph); 1264 evsel->name = do_read_string(fd, ph);
1263 1265
@@ -2626,6 +2628,8 @@ int perf_session__read_header(struct perf_session *session, int fd)
2626 2628
2627 if (evsel == NULL) 2629 if (evsel == NULL)
2628 goto out_delete_evlist; 2630 goto out_delete_evlist;
2631
2632 evsel->needs_swap = header->needs_swap;
2629 /* 2633 /*
2630 * Do it before so that if perf_evsel__alloc_id fails, this 2634 * Do it before so that if perf_evsel__alloc_id fails, this
2631 * entry gets purged too at perf_evlist__delete(). 2635 * entry gets purged too at perf_evlist__delete().
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index ca85444bcfbf..9181bf212fb9 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -805,7 +805,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,
805 if (pyevent == NULL) 805 if (pyevent == NULL)
806 return PyErr_NoMemory(); 806 return PyErr_NoMemory();
807 807
808 err = perf_evlist__parse_sample(evlist, event, &pevent->sample, false); 808 err = perf_evlist__parse_sample(evlist, event, &pevent->sample);
809 if (err) 809 if (err)
810 return PyErr_Format(PyExc_OSError, 810 return PyErr_Format(PyExc_OSError,
811 "perf: can't parse sample, err=%d", err); 811 "perf: can't parse sample, err=%d", err);
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 3049b0ae7003..8cdd23239c90 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -722,8 +722,7 @@ static int flush_sample_queue(struct perf_session *s,
722 if (iter->timestamp > limit) 722 if (iter->timestamp > limit)
723 break; 723 break;
724 724
725 ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample, 725 ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample);
726 s->header.needs_swap);
727 if (ret) 726 if (ret)
728 pr_err("Can't parse sample, err = %d\n", ret); 727 pr_err("Can't parse sample, err = %d\n", ret);
729 else { 728 else {
@@ -1174,8 +1173,7 @@ static int perf_session__process_event(struct perf_session *session,
1174 /* 1173 /*
1175 * For all kernel events we get the sample data 1174 * For all kernel events we get the sample data
1176 */ 1175 */
1177 ret = perf_evlist__parse_sample(session->evlist, event, &sample, 1176 ret = perf_evlist__parse_sample(session->evlist, event, &sample);
1178 session->header.needs_swap);
1179 if (ret) 1177 if (ret)
1180 return ret; 1178 return ret;
1181 1179