diff options
-rw-r--r-- | tools/perf/builtin-inject.c | 8 | ||||
-rw-r--r-- | tools/perf/util/header.c | 19 | ||||
-rw-r--r-- | tools/perf/util/header.h | 2 | ||||
-rw-r--r-- | tools/perf/util/session.c | 16 | ||||
-rw-r--r-- | tools/perf/util/session.h | 6 |
5 files changed, 34 insertions, 17 deletions
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index 8dfc12bb119..978751ec64c 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c | |||
@@ -36,6 +36,12 @@ static int perf_event__repipe_synth(union perf_event *event, | |||
36 | return 0; | 36 | return 0; |
37 | } | 37 | } |
38 | 38 | ||
39 | static int perf_event__repipe_attr(union perf_event *event, | ||
40 | struct perf_evlist **pevlist __used) | ||
41 | { | ||
42 | return perf_event__repipe_synth(event, NULL); | ||
43 | } | ||
44 | |||
39 | static int perf_event__repipe(union perf_event *event, | 45 | static int perf_event__repipe(union perf_event *event, |
40 | struct perf_sample *sample __used, | 46 | struct perf_sample *sample __used, |
41 | struct perf_session *session) | 47 | struct perf_session *session) |
@@ -182,7 +188,7 @@ struct perf_event_ops inject_ops = { | |||
182 | .read = perf_event__repipe, | 188 | .read = perf_event__repipe, |
183 | .throttle = perf_event__repipe, | 189 | .throttle = perf_event__repipe, |
184 | .unthrottle = perf_event__repipe, | 190 | .unthrottle = perf_event__repipe, |
185 | .attr = perf_event__repipe_synth, | 191 | .attr = perf_event__repipe_attr, |
186 | .event_type = perf_event__repipe_synth, | 192 | .event_type = perf_event__repipe_synth, |
187 | .tracing_data = perf_event__repipe_synth, | 193 | .tracing_data = perf_event__repipe_synth, |
188 | .build_id = perf_event__repipe_synth, | 194 | .build_id = perf_event__repipe_synth, |
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 41424a16be8..1fa97dd2120 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
@@ -2120,23 +2120,23 @@ int perf_session__synthesize_attrs(struct perf_session *session, | |||
2120 | } | 2120 | } |
2121 | 2121 | ||
2122 | int perf_event__process_attr(union perf_event *event, | 2122 | int perf_event__process_attr(union perf_event *event, |
2123 | struct perf_session *session) | 2123 | struct perf_evlist **pevlist) |
2124 | { | 2124 | { |
2125 | unsigned int i, ids, n_ids; | 2125 | unsigned int i, ids, n_ids; |
2126 | struct perf_evsel *evsel; | 2126 | struct perf_evsel *evsel; |
2127 | struct perf_evlist *evlist = *pevlist; | ||
2127 | 2128 | ||
2128 | if (session->evlist == NULL) { | 2129 | if (evlist == NULL) { |
2129 | session->evlist = perf_evlist__new(NULL, NULL); | 2130 | *pevlist = evlist = perf_evlist__new(NULL, NULL); |
2130 | if (session->evlist == NULL) | 2131 | if (evlist == NULL) |
2131 | return -ENOMEM; | 2132 | return -ENOMEM; |
2132 | } | 2133 | } |
2133 | 2134 | ||
2134 | evsel = perf_evsel__new(&event->attr.attr, | 2135 | evsel = perf_evsel__new(&event->attr.attr, evlist->nr_entries); |
2135 | session->evlist->nr_entries); | ||
2136 | if (evsel == NULL) | 2136 | if (evsel == NULL) |
2137 | return -ENOMEM; | 2137 | return -ENOMEM; |
2138 | 2138 | ||
2139 | perf_evlist__add(session->evlist, evsel); | 2139 | perf_evlist__add(evlist, evsel); |
2140 | 2140 | ||
2141 | ids = event->header.size; | 2141 | ids = event->header.size; |
2142 | ids -= (void *)&event->attr.id - (void *)event; | 2142 | ids -= (void *)&event->attr.id - (void *)event; |
@@ -2150,12 +2150,9 @@ int perf_event__process_attr(union perf_event *event, | |||
2150 | return -ENOMEM; | 2150 | return -ENOMEM; |
2151 | 2151 | ||
2152 | for (i = 0; i < n_ids; i++) { | 2152 | for (i = 0; i < n_ids; i++) { |
2153 | perf_evlist__id_add(session->evlist, evsel, 0, i, | 2153 | perf_evlist__id_add(evlist, evsel, 0, i, event->attr.id[i]); |
2154 | event->attr.id[i]); | ||
2155 | } | 2154 | } |
2156 | 2155 | ||
2157 | perf_session__update_sample_type(session); | ||
2158 | |||
2159 | return 0; | 2156 | return 0; |
2160 | } | 2157 | } |
2161 | 2158 | ||
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index 3d5a742f4a2..0a88982bc39 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h | |||
@@ -101,7 +101,7 @@ int perf_event__synthesize_attr(struct perf_event_attr *attr, u16 ids, u64 *id, | |||
101 | struct perf_session *session); | 101 | struct perf_session *session); |
102 | int perf_session__synthesize_attrs(struct perf_session *session, | 102 | int perf_session__synthesize_attrs(struct perf_session *session, |
103 | perf_event__handler_t process); | 103 | perf_event__handler_t process); |
104 | int perf_event__process_attr(union perf_event *event, struct perf_session *session); | 104 | int perf_event__process_attr(union perf_event *event, struct perf_evlist **pevlist); |
105 | 105 | ||
106 | int perf_event__synthesize_event_type(u64 event_id, char *name, | 106 | int perf_event__synthesize_event_type(u64 event_id, char *name, |
107 | perf_event__handler_t process, | 107 | perf_event__handler_t process, |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 675e080f66b..6e7d5f54b37 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -277,6 +277,13 @@ static int process_event_synth_stub(union perf_event *event __used, | |||
277 | return 0; | 277 | return 0; |
278 | } | 278 | } |
279 | 279 | ||
280 | static int process_event_synth_attr_stub(union perf_event *event __used, | ||
281 | struct perf_evlist **pevlist __used) | ||
282 | { | ||
283 | dump_printf(": unhandled!\n"); | ||
284 | return 0; | ||
285 | } | ||
286 | |||
280 | static int process_event_sample_stub(union perf_event *event __used, | 287 | static int process_event_sample_stub(union perf_event *event __used, |
281 | struct perf_sample *sample __used, | 288 | struct perf_sample *sample __used, |
282 | struct perf_evsel *evsel __used, | 289 | struct perf_evsel *evsel __used, |
@@ -327,7 +334,7 @@ static void perf_event_ops__fill_defaults(struct perf_event_ops *handler) | |||
327 | if (handler->unthrottle == NULL) | 334 | if (handler->unthrottle == NULL) |
328 | handler->unthrottle = process_event_stub; | 335 | handler->unthrottle = process_event_stub; |
329 | if (handler->attr == NULL) | 336 | if (handler->attr == NULL) |
330 | handler->attr = process_event_synth_stub; | 337 | handler->attr = process_event_synth_attr_stub; |
331 | if (handler->event_type == NULL) | 338 | if (handler->event_type == NULL) |
332 | handler->event_type = process_event_synth_stub; | 339 | handler->event_type = process_event_synth_stub; |
333 | if (handler->tracing_data == NULL) | 340 | if (handler->tracing_data == NULL) |
@@ -794,12 +801,17 @@ static int perf_session__preprocess_sample(struct perf_session *session, | |||
794 | static int perf_session__process_user_event(struct perf_session *session, union perf_event *event, | 801 | static int perf_session__process_user_event(struct perf_session *session, union perf_event *event, |
795 | struct perf_event_ops *ops, u64 file_offset) | 802 | struct perf_event_ops *ops, u64 file_offset) |
796 | { | 803 | { |
804 | int err; | ||
805 | |||
797 | dump_event(session, event, file_offset, NULL); | 806 | dump_event(session, event, file_offset, NULL); |
798 | 807 | ||
799 | /* These events are processed right away */ | 808 | /* These events are processed right away */ |
800 | switch (event->header.type) { | 809 | switch (event->header.type) { |
801 | case PERF_RECORD_HEADER_ATTR: | 810 | case PERF_RECORD_HEADER_ATTR: |
802 | return ops->attr(event, session); | 811 | err = ops->attr(event, &session->evlist); |
812 | if (err == 0) | ||
813 | perf_session__update_sample_type(session); | ||
814 | return err; | ||
803 | case PERF_RECORD_HEADER_EVENT_TYPE: | 815 | case PERF_RECORD_HEADER_EVENT_TYPE: |
804 | return ops->event_type(event, session); | 816 | return ops->event_type(event, session); |
805 | case PERF_RECORD_HEADER_TRACING_DATA: | 817 | case PERF_RECORD_HEADER_TRACING_DATA: |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 76d462d3bef..13bd5e0a069 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
@@ -63,6 +63,8 @@ typedef int (*event_op)(union perf_event *self, struct perf_sample *sample, | |||
63 | struct perf_session *session); | 63 | struct perf_session *session); |
64 | typedef int (*event_synth_op)(union perf_event *self, | 64 | typedef int (*event_synth_op)(union perf_event *self, |
65 | struct perf_session *session); | 65 | struct perf_session *session); |
66 | typedef int (*event_attr_op)(union perf_event *event, | ||
67 | struct perf_evlist **pevlist); | ||
66 | typedef int (*event_op2)(union perf_event *self, struct perf_session *session, | 68 | typedef int (*event_op2)(union perf_event *self, struct perf_session *session, |
67 | struct perf_event_ops *ops); | 69 | struct perf_event_ops *ops); |
68 | 70 | ||
@@ -76,8 +78,8 @@ struct perf_event_ops { | |||
76 | read, | 78 | read, |
77 | throttle, | 79 | throttle, |
78 | unthrottle; | 80 | unthrottle; |
79 | event_synth_op attr, | 81 | event_attr_op attr; |
80 | event_type, | 82 | event_synth_op event_type, |
81 | tracing_data, | 83 | tracing_data, |
82 | build_id; | 84 | build_id; |
83 | event_op2 finished_round; | 85 | event_op2 finished_round; |