diff options
| -rw-r--r-- | tools/perf/builtin-test.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/event.c | 16 | ||||
| -rw-r--r-- | tools/perf/util/event.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/evlist.c | 55 | ||||
| -rw-r--r-- | tools/perf/util/evlist.h | 6 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 16 | ||||
| -rw-r--r-- | tools/perf/util/evsel.h | 7 | ||||
| -rw-r--r-- | tools/perf/util/python.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/session.c | 12 |
9 files changed, 74 insertions, 44 deletions
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index b67186228c89..2da9162262b0 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
| @@ -474,7 +474,7 @@ static int test__basic_mmap(void) | |||
| 474 | unsigned int nr_events[nsyscalls], | 474 | unsigned int nr_events[nsyscalls], |
| 475 | expected_nr_events[nsyscalls], i, j; | 475 | expected_nr_events[nsyscalls], i, j; |
| 476 | struct perf_evsel *evsels[nsyscalls], *evsel; | 476 | struct perf_evsel *evsels[nsyscalls], *evsel; |
| 477 | int sample_size = perf_sample_size(attr.sample_type); | 477 | int sample_size = __perf_evsel__sample_size(attr.sample_type); |
| 478 | 478 | ||
| 479 | for (i = 0; i < nsyscalls; ++i) { | 479 | for (i = 0; i < nsyscalls; ++i) { |
| 480 | char name[64]; | 480 | char name[64]; |
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 0fe9adf76379..3c1b8a632101 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
| @@ -35,22 +35,6 @@ const char *perf_event__name(unsigned int id) | |||
| 35 | return perf_event__names[id]; | 35 | return perf_event__names[id]; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | int perf_sample_size(u64 sample_type) | ||
| 39 | { | ||
| 40 | u64 mask = sample_type & PERF_SAMPLE_MASK; | ||
| 41 | int size = 0; | ||
| 42 | int i; | ||
| 43 | |||
| 44 | for (i = 0; i < 64; i++) { | ||
| 45 | if (mask & (1ULL << i)) | ||
| 46 | size++; | ||
| 47 | } | ||
| 48 | |||
| 49 | size *= sizeof(u64); | ||
| 50 | |||
| 51 | return size; | ||
| 52 | } | ||
| 53 | |||
| 54 | static struct perf_sample synth_sample = { | 38 | static struct perf_sample synth_sample = { |
| 55 | .pid = -1, | 39 | .pid = -1, |
| 56 | .tid = -1, | 40 | .tid = -1, |
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h index c08332871408..1d7f66488a88 100644 --- a/tools/perf/util/event.h +++ b/tools/perf/util/event.h | |||
| @@ -82,8 +82,6 @@ struct perf_sample { | |||
| 82 | struct ip_callchain *callchain; | 82 | struct ip_callchain *callchain; |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | int perf_sample_size(u64 sample_type); | ||
| 86 | |||
| 87 | #define BUILD_ID_SIZE 20 | 85 | #define BUILD_ID_SIZE 20 |
| 88 | 86 | ||
| 89 | struct build_id_event { | 87 | struct build_id_event { |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 04c8a60075b3..b021ea9265c3 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
| @@ -455,33 +455,46 @@ int perf_evlist__set_filters(struct perf_evlist *evlist) | |||
| 455 | return 0; | 455 | return 0; |
| 456 | } | 456 | } |
| 457 | 457 | ||
| 458 | u64 perf_evlist__sample_type(struct perf_evlist *evlist) | 458 | bool perf_evlist__valid_sample_type(const struct perf_evlist *evlist) |
| 459 | { | 459 | { |
| 460 | struct perf_evsel *pos; | 460 | struct perf_evsel *pos, *first; |
| 461 | u64 type = 0; | 461 | |
| 462 | 462 | pos = first = list_entry(evlist->entries.next, struct perf_evsel, node); | |
| 463 | list_for_each_entry(pos, &evlist->entries, node) { | 463 | |
| 464 | if (!type) | 464 | list_for_each_entry_continue(pos, &evlist->entries, node) { |
| 465 | type = pos->attr.sample_type; | 465 | if (first->attr.sample_type != pos->attr.sample_type) |
| 466 | else if (type != pos->attr.sample_type) | 466 | return false; |
| 467 | die("non matching sample_type"); | ||
| 468 | } | 467 | } |
| 469 | 468 | ||
| 470 | return type; | 469 | return true; |
| 471 | } | 470 | } |
| 472 | 471 | ||
| 473 | bool perf_evlist__sample_id_all(const struct perf_evlist *evlist) | 472 | u64 perf_evlist__sample_type(const struct perf_evlist *evlist) |
| 473 | { | ||
| 474 | struct perf_evsel *first; | ||
| 475 | |||
| 476 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
| 477 | return first->attr.sample_type; | ||
| 478 | } | ||
| 479 | |||
| 480 | bool perf_evlist__valid_sample_id_all(const struct perf_evlist *evlist) | ||
| 474 | { | 481 | { |
| 475 | bool value = false, first = true; | 482 | struct perf_evsel *pos, *first; |
| 476 | struct perf_evsel *pos; | 483 | |
| 477 | 484 | pos = first = list_entry(evlist->entries.next, struct perf_evsel, node); | |
| 478 | list_for_each_entry(pos, &evlist->entries, node) { | 485 | |
| 479 | if (first) { | 486 | list_for_each_entry_continue(pos, &evlist->entries, node) { |
| 480 | value = pos->attr.sample_id_all; | 487 | if (first->attr.sample_id_all != pos->attr.sample_id_all) |
| 481 | first = false; | 488 | return false; |
| 482 | } else if (value != pos->attr.sample_id_all) | ||
| 483 | die("non matching sample_id_all"); | ||
| 484 | } | 489 | } |
| 485 | 490 | ||
| 486 | return value; | 491 | return true; |
| 492 | } | ||
| 493 | |||
| 494 | bool perf_evlist__sample_id_all(const struct perf_evlist *evlist) | ||
| 495 | { | ||
| 496 | struct perf_evsel *first; | ||
| 497 | |||
| 498 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | ||
| 499 | return first->attr.sample_id_all; | ||
| 487 | } | 500 | } |
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index 0a1ef1f051f0..b2b862374f37 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h | |||
| @@ -66,7 +66,9 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid, | |||
| 66 | void perf_evlist__delete_maps(struct perf_evlist *evlist); | 66 | void perf_evlist__delete_maps(struct perf_evlist *evlist); |
| 67 | int perf_evlist__set_filters(struct perf_evlist *evlist); | 67 | int perf_evlist__set_filters(struct perf_evlist *evlist); |
| 68 | 68 | ||
| 69 | u64 perf_evlist__sample_type(struct perf_evlist *evlist); | 69 | u64 perf_evlist__sample_type(const struct perf_evlist *evlist); |
| 70 | bool perf_evlist__sample_id_all(const struct perf_evlist *evlist); | 70 | bool perf_evlist__sample_id_all(const const struct perf_evlist *evlist); |
| 71 | 71 | ||
| 72 | bool perf_evlist__valid_sample_type(const struct perf_evlist *evlist); | ||
| 73 | bool perf_evlist__valid_sample_id_all(const struct perf_evlist *evlist); | ||
| 72 | #endif /* __PERF_EVLIST_H */ | 74 | #endif /* __PERF_EVLIST_H */ |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index cca29ededb5b..0239eb87b232 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
| @@ -15,6 +15,22 @@ | |||
| 15 | 15 | ||
| 16 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) | 16 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) |
| 17 | 17 | ||
| 18 | int __perf_evsel__sample_size(u64 sample_type) | ||
| 19 | { | ||
| 20 | u64 mask = sample_type & PERF_SAMPLE_MASK; | ||
| 21 | int size = 0; | ||
| 22 | int i; | ||
| 23 | |||
| 24 | for (i = 0; i < 64; i++) { | ||
| 25 | if (mask & (1ULL << i)) | ||
| 26 | size++; | ||
| 27 | } | ||
| 28 | |||
| 29 | size *= sizeof(u64); | ||
| 30 | |||
| 31 | return size; | ||
| 32 | } | ||
| 33 | |||
| 18 | void perf_evsel__init(struct perf_evsel *evsel, | 34 | void perf_evsel__init(struct perf_evsel *evsel, |
| 19 | struct perf_event_attr *attr, int idx) | 35 | struct perf_event_attr *attr, int idx) |
| 20 | { | 36 | { |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index f79bb2c09a6c..7e9366e4490b 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
| @@ -149,4 +149,11 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel, | |||
| 149 | return __perf_evsel__read(evsel, ncpus, nthreads, true); | 149 | return __perf_evsel__read(evsel, ncpus, nthreads, true); |
| 150 | } | 150 | } |
| 151 | 151 | ||
| 152 | int __perf_evsel__sample_size(u64 sample_type); | ||
| 153 | |||
| 154 | static inline int perf_evsel__sample_size(struct perf_evsel *evsel) | ||
| 155 | { | ||
| 156 | return __perf_evsel__sample_size(evsel->attr.sample_type); | ||
| 157 | } | ||
| 158 | |||
| 152 | #endif /* __PERF_EVSEL_H */ | 159 | #endif /* __PERF_EVSEL_H */ |
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 2dd1698e0932..24063b4d41e0 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c | |||
| @@ -692,7 +692,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, | |||
| 692 | 692 | ||
| 693 | first = list_entry(evlist->entries.next, struct perf_evsel, node); | 693 | first = list_entry(evlist->entries.next, struct perf_evsel, node); |
| 694 | err = perf_event__parse_sample(event, first->attr.sample_type, | 694 | err = perf_event__parse_sample(event, first->attr.sample_type, |
| 695 | perf_sample_size(first->attr.sample_type), | 695 | perf_evsel__sample_size(first), |
| 696 | sample_id_all, &pevent->sample); | 696 | sample_id_all, &pevent->sample); |
| 697 | if (err) | 697 | if (err) |
| 698 | return PyErr_Format(PyExc_OSError, | 698 | return PyErr_Format(PyExc_OSError, |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 64500fc78799..f5a8fbdd3f76 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -58,6 +58,16 @@ static int perf_session__open(struct perf_session *self, bool force) | |||
| 58 | goto out_close; | 58 | goto out_close; |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | if (!perf_evlist__valid_sample_type(self->evlist)) { | ||
| 62 | pr_err("non matching sample_type"); | ||
| 63 | goto out_close; | ||
| 64 | } | ||
| 65 | |||
| 66 | if (!perf_evlist__valid_sample_id_all(self->evlist)) { | ||
| 67 | pr_err("non matching sample_id_all"); | ||
| 68 | goto out_close; | ||
| 69 | } | ||
| 70 | |||
| 61 | self->size = input_stat.st_size; | 71 | self->size = input_stat.st_size; |
| 62 | return 0; | 72 | return 0; |
| 63 | 73 | ||
| @@ -97,7 +107,7 @@ out: | |||
| 97 | void perf_session__update_sample_type(struct perf_session *self) | 107 | void perf_session__update_sample_type(struct perf_session *self) |
| 98 | { | 108 | { |
| 99 | self->sample_type = perf_evlist__sample_type(self->evlist); | 109 | self->sample_type = perf_evlist__sample_type(self->evlist); |
| 100 | self->sample_size = perf_sample_size(self->sample_type); | 110 | self->sample_size = __perf_evsel__sample_size(self->sample_type); |
| 101 | self->sample_id_all = perf_evlist__sample_id_all(self->evlist); | 111 | self->sample_id_all = perf_evlist__sample_id_all(self->evlist); |
| 102 | perf_session__id_header_size(self); | 112 | perf_session__id_header_size(self); |
| 103 | } | 113 | } |
