History

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.

Arnaldo Carvalho de Melo committed 14 years ago

Commit 0807d2d1 parent a14bb7a9 files · +24 −18Browse files

Unified · Split

9 files
  1. tools/perf/builtin-test.c +2 −2
  2. tools/perf/builtin-top.c +1 −1
  3. tools/perf/util/evlist.c +2 −2
  4. tools/perf/util/evlist.h +1 −1
  5. tools/perf/util/evsel.c +8 −5
  6. tools/perf/util/evsel.h +2 −1
  7. tools/perf/util/header.c +5 −1
  8. tools/perf/util/python.c +1 −1
  9. tools/perf/util/session.c +2 −4
tools/perf/builtin-test.c+2−2
@@ -564,7 +564,7 @@ static int test__basic_mmap(void) · 563 unmodified lines
564564 goto out_munmap;
565565 }
566566
567− err = perf_evlist__parse_sample(evlist, event, &sample, false);
567+ err = perf_evlist__parse_sample(evlist, event, &sample);
568568 if (err) {
569569 pr_err("Can't parse sample, err = %d\n", err);
570570 goto out_munmap;
@@ -781,7 +781,7 @@ static int test__PERF_RECORD(void) · 210 unmodified lines
781781 if (type < PERF_RECORD_MAX)
782782 nr_events[type]++;
783783
784− err = perf_evlist__parse_sample(evlist, event, &sample, false);
784+ err = perf_evlist__parse_sample(evlist, event, &sample);
785785 if (err < 0) {
786786 if (verbose)
787787 perf_event__fprintf(event, stderr);
tools/perf/builtin-top.c+1−1
@@ -823,7 +823,7 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx) · 822 unmodified lines
823823 int ret;
824824
825825 while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) {
826− ret = perf_evlist__parse_sample(top->evlist, event, &sample, false);
826+ ret = perf_evlist__parse_sample(top->evlist, event, &sample);
827827 if (ret) {
828828 pr_err("Can't parse sample, err = %d\n", ret);
829829 continue;
tools/perf/util/evlist.c+2−2
@@ -884,10 +884,10 @@ int perf_evlist__start_workload(struct perf_evlist *evlist) · 883 unmodified lines
884884 }
885885
886886 int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
887− struct perf_sample *sample, bool swapped)
887+ struct perf_sample *sample)
888888 {
889889 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);
891891 }
892892
893893 size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
tools/perf/util/evlist.h+1−1
@@ -125,7 +125,7 @@ bool perf_evlist__sample_id_all(struct perf_evlist *evlist); · 124 unmodified lines
125125 u16 perf_evlist__id_hdr_size(struct perf_evlist *evlist);
126126
127127 int perf_evlist__parse_sample(struct perf_evlist *evlist, union perf_event *event,
128− struct perf_sample *sample, bool swapped);
128+ struct perf_sample *sample);
129129
130130 bool perf_evlist__valid_sample_type(struct perf_evlist *evlist);
131131 bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist);
tools/perf/util/evsel.c+8−5
@@ -767,11 +767,13 @@ int perf_evsel__open_per_thread(struct perf_evsel *evsel, · 766 unmodified lines
767767 return __perf_evsel__open(evsel, &empty_cpu_map.map, threads);
768768 }
769769
770−static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
771− struct perf_sample *sample,
772− bool swapped)
770+static int perf_evsel__parse_id_sample(const struct perf_evsel *evsel,
771+ const union perf_event *event,
772+ struct perf_sample *sample)
773773 {
774+ u64 type = evsel->attr.sample_type;
774775 const u64 *array = event->sample.array;
776+ bool swapped = evsel->needs_swap;
775777 union u64_swap u;
776778
777779 array += ((event->header.size -
@@ -832,10 +834,11 @@ static bool sample_overlap(const union perf_event *event, · 54 unmodified lines
832834 }
833835
834836 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
835− struct perf_sample *data, bool swapped)
837+ struct perf_sample *data)
836838 {
837839 u64 type = evsel->attr.sample_type;
838840 u64 regs_user = evsel->attr.sample_regs_user;
841+ bool swapped = evsel->needs_swap;
839842 const u64 *array;
840843
841844 /*
@@ -852,7 +855,7 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event, · 10 unmodified lines
852855 if (event->header.type != PERF_RECORD_SAMPLE) {
853856 if (!evsel->attr.sample_id_all)
854857 return 0;
855− return perf_event__parse_id_sample(event, type, data, swapped);
858+ return perf_evsel__parse_id_sample(evsel, event, data);
856859 }
857860
858861 array = event->sample.array;
tools/perf/util/evsel.h+2−1
@@ -69,6 +69,7 @@ struct perf_evsel { · 68 unmodified lines
6969 struct cpu_map *cpus;
7070 unsigned int sample_size;
7171 bool supported;
72+ bool needs_swap;
7273 /* parse modifier helper */
7374 int exclude_GH;
7475 struct perf_evsel *leader;
@@ -205,7 +206,7 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel, · 130 unmodified lines
205206 void hists__init(struct hists *hists);
206207
207208 int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
208− struct perf_sample *sample, bool swapped);
209+ struct perf_sample *sample);
209210
210211 static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel)
211212 {
tools/perf/util/header.c+5−1
@@ -1256,8 +1256,10 @@ read_event_desc(struct perf_header *ph, int fd) · 1255 unmodified lines
12561256 if (ret != (ssize_t)sizeof(nr))
12571257 goto error;
12581258
1259− if (ph->needs_swap)
1259+ if (ph->needs_swap) {
12601260 nr = bswap_32(nr);
1261+ evsel->needs_swap = true;
1262+ }
12611263
12621264 evsel->name = do_read_string(fd, ph);
12631265
@@ -2626,6 +2628,8 @@ int perf_session__read_header(struct perf_session *session, int fd) · 1362 unmodified lines
26262628
26272629 if (evsel == NULL)
26282630 goto out_delete_evlist;
2631+
2632+ evsel->needs_swap = header->needs_swap;
26292633 /*
26302634 * Do it before so that if perf_evsel__alloc_id fails, this
26312635 * entry gets purged too at perf_evlist__delete().
tools/perf/util/python.c+1−1
@@ -805,7 +805,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, · 804 unmodified lines
805805 if (pyevent == NULL)
806806 return PyErr_NoMemory();
807807
808− err = perf_evlist__parse_sample(evlist, event, &pevent->sample, false);
808+ err = perf_evlist__parse_sample(evlist, event, &pevent->sample);
809809 if (err)
810810 return PyErr_Format(PyExc_OSError,
811811 "perf: can't parse sample, err=%d", err);
tools/perf/util/session.c+2−4
@@ -722,8 +722,7 @@ static int flush_sample_queue(struct perf_session *s, · 721 unmodified lines
722722 if (iter->timestamp > limit)
723723 break;
724724
725− ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample,
726− s->header.needs_swap);
725+ ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample);
727726 if (ret)
728727 pr_err("Can't parse sample, err = %d\n", ret);
729728 else {
@@ -1174,8 +1173,7 @@ static int perf_session__process_event(struct perf_session *session, · 444 unmodified lines
11741173 /*
11751174 * For all kernel events we get the sample data
11761175 */
1177− ret = perf_evlist__parse_sample(session->evlist, event, &sample,
1178− session->header.needs_swap);
1176+ ret = perf_evlist__parse_sample(session->evlist, event, &sample);
11791177 if (ret)
11801178 return ret;
11811179