aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2011-11-11 19:45:41 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2011-11-28 07:37:43 -0500
commit10d0f086df77f3ff259b46cb501362dbaf2c7989 (patch)
tree69c8d8ccca5545c524abe0ac52a149e78fbc279f
parent81e36bffad95e015af9741b5b1ee16afe08aab05 (diff)
perf event: perf_event_ops->attr() manipulates only an evlist
Removing another case where a perf_session is required when processing events. Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> 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-ug1wtjbnva4bxwknflkkrlrh@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/builtin-inject.c8
-rw-r--r--tools/perf/util/header.c19
-rw-r--r--tools/perf/util/header.h2
-rw-r--r--tools/perf/util/session.c16
-rw-r--r--tools/perf/util/session.h6
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
39static 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
39static int perf_event__repipe(union perf_event *event, 45static 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
2122int perf_event__process_attr(union perf_event *event, 2122int 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);
102int perf_session__synthesize_attrs(struct perf_session *session, 102int perf_session__synthesize_attrs(struct perf_session *session,
103 perf_event__handler_t process); 103 perf_event__handler_t process);
104int perf_event__process_attr(union perf_event *event, struct perf_session *session); 104int perf_event__process_attr(union perf_event *event, struct perf_evlist **pevlist);
105 105
106int perf_event__synthesize_event_type(u64 event_id, char *name, 106int 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
280static 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
280static int process_event_sample_stub(union perf_event *event __used, 287static 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,
794static int perf_session__process_user_event(struct perf_session *session, union perf_event *event, 801static 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);
64typedef int (*event_synth_op)(union perf_event *self, 64typedef int (*event_synth_op)(union perf_event *self,
65 struct perf_session *session); 65 struct perf_session *session);
66typedef int (*event_attr_op)(union perf_event *event,
67 struct perf_evlist **pevlist);
66typedef int (*event_op2)(union perf_event *self, struct perf_session *session, 68typedef 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;