perf evlist: Don't die if sample_{id_all|type} is invalid
Commit-ID: c2a70653af45c9cbb0cab900e8931b062e57b1ae Gitweb: http://git.kernel.org/tip/c2a70653af45c9cbb0cab900e8931b062e57b1ae Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 2 Jun 2011 11:04:54 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Thu, 2 Jun 2011 11:04:54 -0300
perf evlist: Don't die if sample_{id_all|type} is invalid
Fixes two more cases where the python binding would not load:
. Not finding die(), which it shouldn't anyway, not good to just stop the
world because some particular perf.data file is invalid, just propagate the error to the caller.
. Not finding perf_sample_size: fix it by moving it from event.c to evsel,
where it belongs, as most cases are moving to operate on an evsel object.o
One of the fixed problems:
[root@emilia ~]# python
Quoted 1 line
Quoted 1 line
Quoted 1 line
import perf
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/acme/git/build/perf/python/perf.so: undefined symbol: perf_sample_size
Quoted 1 line
Quoted 1 line
Quoted 1 line
[root@emilia ~]#
Cc Frederic Weisbecker <[email protected]>
Cc Mike Galbraith <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/builtin-test.c | 2 +- tools/perf/util/event.c | 16 ------------- tools/perf/util/event.h | 2 - tools/perf/util/evlist.c | 55 +++++++++++++++++++++++++++----------------- tools/perf/util/evlist.h | 6 +++- tools/perf/util/evsel.c | 16 +++++++++++++ tools/perf/util/evsel.h | 7 +++++ tools/perf/util/python.c | 2 +- tools/perf/util/session.c | 12 +++++++++- 9 files changed, 74 insertions(+), 44 deletions(-)
tools/perf/builtin-test.c +1 -1
@@ -474,7 +474,7 @@ static int test__basic_mmap(void)unsigned int nr_events[nsyscalls], expected_nr_events[nsyscalls], i, j;struct perf_evsel *evsels[nsyscalls], *evsel; -int sample_size =perf_sample_size (attr.sample_type); +int sample_size =__perf_evsel__sample_size (attr.sample_type);for (i =0 ; i < nsyscalls; ++i) {char name[64 ];
tools/perf/util/event.c +0 -16
@@ -35,22 +35,6 @@ const char *perf_event__name(unsigned int id)return perf_event__names[id]; } -int perf_sample_size (u64 sample_type) -{ -u64 mask = sample_type &PERF_SAMPLE_MASK ; -int size =0 ; -int i; - -for (i =0 ; i <64 ; i++) { -if (mask & (1ULL << i)) - size++; - } - - size *=sizeof (u64); - -return size; -} -static struct perf_sample synth_sample = { .pid =-1 , .tid =-1 ,
tools/perf/util/event.h +0 -2
@@ -82,8 +82,6 @@ struct perf_sample {struct ip_callchain *callchain; }; -int perf_sample_size (u64 sample_type); -#define BUILD_ID_SIZE 20struct build_id_event {
tools/perf/util/evlist.c +34 -21
67 lines not on this page · raw message
tools/perf/util/evlist.h +4 -2
@@ -66,7 +66,9 @@ int perf_evlist__create_maps(struct perf_evlist *evlist, pid_t target_pid,void perf_evlist__delete_maps (struct perf_evlist *evlist);int perf_evlist__set_filters (struct perf_evlist *evlist); -u64 perf_evlist__sample_type (struct perf_evlist *evlist); -bool perf_evlist__sample_id_all (const struct perf_evlist *evlist); +u64 perf_evlist__sample_type (const struct perf_evlist *evlist); +bool perf_evlist__sample_id_all (const const struct perf_evlist *evlist); +bool perf_evlist__valid_sample_type (const struct perf_evlist *evlist); +bool perf_evlist__valid_sample_id_all (const struct perf_evlist *evlist);#endif /* __PERF_EVLIST_H */
tools/perf/util/evsel.c +16 -0
@@ -15,6 +15,22 @@#define FD (e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) +int __perf_evsel__sample_size (u64 sample_type) +{ +u64 mask = sample_type &PERF_SAMPLE_MASK ; +int size =0 ; +int i; + +for (i =0 ; i <64 ; i++) { +if (mask & (1ULL << i)) + size++; + } + + size *=sizeof (u64); + +return size; +} +void perf_evsel__init (struct perf_evsel *evsel,struct perf_event_attr *attr,int idx) {
tools/perf/util/evsel.h +7 -0
@@ -149,4 +149,11 @@ static inline int perf_evsel__read_scaled(struct perf_evsel *evsel, return __perf_evsel__read(evsel, ncpus, nthreads, true); } +int __perf_evsel__sample_size (u64 sample_type); + +static inline int perf_evsel__sample_size (struct perf_evsel *evsel) +{ +return __perf_evsel__sample_size (evsel->attr.sample_type); +} +#endif /* __PERF_EVSEL_H */
tools/perf/util/python.c +1 -1
@@ -692,7 +692,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, first = list_entry(evlist->entries.next, struct perf_evsel, node); err =perf_event__parse_sample (event, first->attr.sample_type, -perf_sample_size (first->attr.sample_type), +perf_evsel__sample_size (first), sample_id_all, &pevent->sample);if (err) return PyErr_Format(PyExc_OSError,
tools/perf/util/session.c +11 -1
@@ -58,6 +58,16 @@ static int perf_session__open(struct perf_session *self, bool force) goto out_close; } +if (!perf_evlist__valid_sample_type (self->evlist)) { +pr_err ("non matching sample_type" ); + goto out_close; + } + +if (!perf_evlist__valid_sample_id_all (self->evlist)) { +pr_err ("non matching sample_id_all" ); + goto out_close; + } + self->size = input_stat.st_size;return 0 ;
@@ -97,7 +107,7 @@ out:void perf_session__update_sample_type (struct perf_session *self) { self->sample_type =perf_evlist__sample_type (self->evlist); - self->sample_size =perf_sample_size (self->sample_type); + self->sample_size =__perf_evsel__sample_size (self->sample_type); self->sample_id_all =perf_evlist__sample_id_all (self->evlist);perf_session__id_header_size (self); }