diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-03-03 09:48:12 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-03-11 09:16:50 -0400 |
commit | fa713a4eb9cebe5dec71b1bd11429603e17d841d (patch) | |
tree | b51adc0b21af2b7584d455ae729de4d0c39c8ff5 /tools | |
parent | 94ac003b665fc04f13a7ab3b2be896b9b9503451 (diff) |
perf ordered_events: Untangle from perf_session
For use by tools that are not perf.data based, as maybe 'perf trace' in
live mode.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Don Zickus <dzickus@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-nedqe7cmii5w82etfi36urfz@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/ordered-events.c | 17 | ||||
-rw-r--r-- | tools/perf/util/ordered-events.h | 8 | ||||
-rw-r--r-- | tools/perf/util/session.c | 37 | ||||
-rw-r--r-- | tools/perf/util/session.h | 3 |
4 files changed, 42 insertions, 23 deletions
diff --git a/tools/perf/util/ordered-events.c b/tools/perf/util/ordered-events.c index 077ddd25189f..e6ab630dd374 100644 --- a/tools/perf/util/ordered-events.c +++ b/tools/perf/util/ordered-events.c | |||
@@ -153,10 +153,11 @@ void ordered_events__delete(struct ordered_events *oe, struct ordered_event *eve | |||
153 | free_dup_event(oe, event->event); | 153 | free_dup_event(oe, event->event); |
154 | } | 154 | } |
155 | 155 | ||
156 | static int __ordered_events__flush(struct perf_session *s, | 156 | static int __ordered_events__flush(struct ordered_events *oe, |
157 | struct machines *machines, | ||
158 | struct perf_evlist *evlist, | ||
157 | struct perf_tool *tool) | 159 | struct perf_tool *tool) |
158 | { | 160 | { |
159 | struct ordered_events *oe = &s->ordered_events; | ||
160 | struct list_head *head = &oe->events; | 161 | struct list_head *head = &oe->events; |
161 | struct ordered_event *tmp, *iter; | 162 | struct ordered_event *tmp, *iter; |
162 | struct perf_sample sample; | 163 | struct perf_sample sample; |
@@ -179,12 +180,12 @@ static int __ordered_events__flush(struct perf_session *s, | |||
179 | if (iter->timestamp > limit) | 180 | if (iter->timestamp > limit) |
180 | break; | 181 | break; |
181 | 182 | ||
182 | ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample); | 183 | ret = perf_evlist__parse_sample(evlist, iter->event, &sample); |
183 | if (ret) | 184 | if (ret) |
184 | pr_err("Can't parse sample, err = %d\n", ret); | 185 | pr_err("Can't parse sample, err = %d\n", ret); |
185 | else { | 186 | else { |
186 | ret = perf_session__deliver_event(s, iter->event, &sample, tool, | 187 | ret = machines__deliver_event(machines, evlist, iter->event, |
187 | iter->file_offset); | 188 | &sample, tool, iter->file_offset); |
188 | if (ret) | 189 | if (ret) |
189 | return ret; | 190 | return ret; |
190 | } | 191 | } |
@@ -204,10 +205,10 @@ static int __ordered_events__flush(struct perf_session *s, | |||
204 | return 0; | 205 | return 0; |
205 | } | 206 | } |
206 | 207 | ||
207 | int ordered_events__flush(struct perf_session *s, struct perf_tool *tool, | 208 | int ordered_events__flush(struct ordered_events *oe, struct machines *machines, |
209 | struct perf_evlist *evlist, struct perf_tool *tool, | ||
208 | enum oe_flush how) | 210 | enum oe_flush how) |
209 | { | 211 | { |
210 | struct ordered_events *oe = &s->ordered_events; | ||
211 | static const char * const str[] = { | 212 | static const char * const str[] = { |
212 | "NONE", | 213 | "NONE", |
213 | "FINAL", | 214 | "FINAL", |
@@ -251,7 +252,7 @@ int ordered_events__flush(struct perf_session *s, struct perf_tool *tool, | |||
251 | str[how], oe->nr_events); | 252 | str[how], oe->nr_events); |
252 | pr_oe_time(oe->max_timestamp, "max_timestamp\n"); | 253 | pr_oe_time(oe->max_timestamp, "max_timestamp\n"); |
253 | 254 | ||
254 | err = __ordered_events__flush(s, tool); | 255 | err = __ordered_events__flush(oe, machines, evlist, tool); |
255 | 256 | ||
256 | if (!err) { | 257 | if (!err) { |
257 | if (how == OE_FLUSH__ROUND) | 258 | if (how == OE_FLUSH__ROUND) |
diff --git a/tools/perf/util/ordered-events.h b/tools/perf/util/ordered-events.h index 7b8f9b011f38..e09f2433c6d6 100644 --- a/tools/perf/util/ordered-events.h +++ b/tools/perf/util/ordered-events.h | |||
@@ -2,9 +2,10 @@ | |||
2 | #define __ORDERED_EVENTS_H | 2 | #define __ORDERED_EVENTS_H |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include "tool.h" | ||
6 | 5 | ||
7 | struct perf_session; | 6 | struct perf_tool; |
7 | struct perf_evlist; | ||
8 | struct machines; | ||
8 | 9 | ||
9 | struct ordered_event { | 10 | struct ordered_event { |
10 | u64 timestamp; | 11 | u64 timestamp; |
@@ -40,7 +41,8 @@ struct ordered_events { | |||
40 | struct ordered_event *ordered_events__new(struct ordered_events *oe, u64 timestamp, | 41 | struct ordered_event *ordered_events__new(struct ordered_events *oe, u64 timestamp, |
41 | union perf_event *event); | 42 | union perf_event *event); |
42 | void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event); | 43 | void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event); |
43 | int ordered_events__flush(struct perf_session *s, struct perf_tool *tool, | 44 | int ordered_events__flush(struct ordered_events *oe, struct machines *machines, |
45 | struct perf_evlist *evlist, struct perf_tool *tool, | ||
44 | enum oe_flush how); | 46 | enum oe_flush how); |
45 | void ordered_events__init(struct ordered_events *oe); | 47 | void ordered_events__init(struct ordered_events *oe); |
46 | void ordered_events__free(struct ordered_events *oe); | 48 | void ordered_events__free(struct ordered_events *oe); |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index ed4e5cf2bd9d..23be146bd2fc 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -512,7 +512,11 @@ static int process_finished_round(struct perf_tool *tool, | |||
512 | union perf_event *event __maybe_unused, | 512 | union perf_event *event __maybe_unused, |
513 | struct perf_session *session) | 513 | struct perf_session *session) |
514 | { | 514 | { |
515 | return ordered_events__flush(session, tool, OE_FLUSH__ROUND); | 515 | struct ordered_events *oe = &session->ordered_events; |
516 | struct perf_evlist *evlist = session->evlist; | ||
517 | struct machines *machines = &session->machines; | ||
518 | |||
519 | return ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__ROUND); | ||
516 | } | 520 | } |
517 | 521 | ||
518 | int perf_session_queue_event(struct perf_session *s, union perf_event *event, | 522 | int perf_session_queue_event(struct perf_session *s, union perf_event *event, |
@@ -520,6 +524,9 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event, | |||
520 | u64 file_offset) | 524 | u64 file_offset) |
521 | { | 525 | { |
522 | struct ordered_events *oe = &s->ordered_events; | 526 | struct ordered_events *oe = &s->ordered_events; |
527 | struct perf_evlist *evlist = s->evlist; | ||
528 | struct machines *machines = &s->machines; | ||
529 | |||
523 | u64 timestamp = sample->time; | 530 | u64 timestamp = sample->time; |
524 | struct ordered_event *new; | 531 | struct ordered_event *new; |
525 | 532 | ||
@@ -536,7 +543,7 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event, | |||
536 | 543 | ||
537 | new = ordered_events__new(oe, timestamp, event); | 544 | new = ordered_events__new(oe, timestamp, event); |
538 | if (!new) { | 545 | if (!new) { |
539 | ordered_events__flush(s, tool, OE_FLUSH__HALF); | 546 | ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__HALF); |
540 | new = ordered_events__new(oe, timestamp, event); | 547 | new = ordered_events__new(oe, timestamp, event); |
541 | } | 548 | } |
542 | 549 | ||
@@ -886,12 +893,12 @@ static int | |||
886 | &sample->read.one, machine); | 893 | &sample->read.one, machine); |
887 | } | 894 | } |
888 | 895 | ||
889 | int perf_session__deliver_event(struct perf_session *session, | 896 | int machines__deliver_event(struct machines *machines, |
897 | struct perf_evlist *evlist, | ||
890 | union perf_event *event, | 898 | union perf_event *event, |
891 | struct perf_sample *sample, | 899 | struct perf_sample *sample, |
892 | struct perf_tool *tool, u64 file_offset) | 900 | struct perf_tool *tool, u64 file_offset) |
893 | { | 901 | { |
894 | struct perf_evlist *evlist = session->evlist; | ||
895 | struct perf_evsel *evsel; | 902 | struct perf_evsel *evsel; |
896 | struct machine *machine; | 903 | struct machine *machine; |
897 | 904 | ||
@@ -899,7 +906,7 @@ int perf_session__deliver_event(struct perf_session *session, | |||
899 | 906 | ||
900 | evsel = perf_evlist__id2evsel(evlist, sample->id); | 907 | evsel = perf_evlist__id2evsel(evlist, sample->id); |
901 | 908 | ||
902 | machine = machines__find_for_cpumode(&session->machines, event, sample); | 909 | machine = machines__find_for_cpumode(machines, event, sample); |
903 | 910 | ||
904 | switch (event->header.type) { | 911 | switch (event->header.type) { |
905 | case PERF_RECORD_SAMPLE: | 912 | case PERF_RECORD_SAMPLE: |
@@ -984,12 +991,14 @@ int perf_session__deliver_synth_event(struct perf_session *session, | |||
984 | struct perf_sample *sample, | 991 | struct perf_sample *sample, |
985 | struct perf_tool *tool) | 992 | struct perf_tool *tool) |
986 | { | 993 | { |
987 | events_stats__inc(&session->evlist->stats, event->header.type); | 994 | struct perf_evlist *evlist = session->evlist; |
995 | |||
996 | events_stats__inc(&evlist->stats, event->header.type); | ||
988 | 997 | ||
989 | if (event->header.type >= PERF_RECORD_USER_TYPE_START) | 998 | if (event->header.type >= PERF_RECORD_USER_TYPE_START) |
990 | return perf_session__process_user_event(session, event, tool, 0); | 999 | return perf_session__process_user_event(session, event, tool, 0); |
991 | 1000 | ||
992 | return perf_session__deliver_event(session, event, sample, tool, 0); | 1001 | return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0); |
993 | } | 1002 | } |
994 | 1003 | ||
995 | static void event_swap(union perf_event *event, bool sample_id_all) | 1004 | static void event_swap(union perf_event *event, bool sample_id_all) |
@@ -1090,8 +1099,8 @@ static s64 perf_session__process_event(struct perf_session *session, | |||
1090 | return ret; | 1099 | return ret; |
1091 | } | 1100 | } |
1092 | 1101 | ||
1093 | return perf_session__deliver_event(session, event, &sample, tool, | 1102 | return machines__deliver_event(&session->machines, evlist, event, |
1094 | file_offset); | 1103 | &sample, tool, file_offset); |
1095 | } | 1104 | } |
1096 | 1105 | ||
1097 | void perf_event_header__bswap(struct perf_event_header *hdr) | 1106 | void perf_event_header__bswap(struct perf_event_header *hdr) |
@@ -1167,6 +1176,9 @@ volatile int session_done; | |||
1167 | static int __perf_session__process_pipe_events(struct perf_session *session, | 1176 | static int __perf_session__process_pipe_events(struct perf_session *session, |
1168 | struct perf_tool *tool) | 1177 | struct perf_tool *tool) |
1169 | { | 1178 | { |
1179 | struct ordered_events *oe = &session->ordered_events; | ||
1180 | struct perf_evlist *evlist = session->evlist; | ||
1181 | struct machines *machines = &session->machines; | ||
1170 | int fd = perf_data_file__fd(session->file); | 1182 | int fd = perf_data_file__fd(session->file); |
1171 | union perf_event *event; | 1183 | union perf_event *event; |
1172 | uint32_t size, cur_size = 0; | 1184 | uint32_t size, cur_size = 0; |
@@ -1246,7 +1258,7 @@ more: | |||
1246 | goto more; | 1258 | goto more; |
1247 | done: | 1259 | done: |
1248 | /* do the final flush for ordered samples */ | 1260 | /* do the final flush for ordered samples */ |
1249 | err = ordered_events__flush(session, tool, OE_FLUSH__FINAL); | 1261 | err = ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__FINAL); |
1250 | out_err: | 1262 | out_err: |
1251 | free(buf); | 1263 | free(buf); |
1252 | perf_tool__warn_about_errors(tool, &session->evlist->stats); | 1264 | perf_tool__warn_about_errors(tool, &session->evlist->stats); |
@@ -1298,6 +1310,9 @@ static int __perf_session__process_events(struct perf_session *session, | |||
1298 | u64 data_offset, u64 data_size, | 1310 | u64 data_offset, u64 data_size, |
1299 | u64 file_size, struct perf_tool *tool) | 1311 | u64 file_size, struct perf_tool *tool) |
1300 | { | 1312 | { |
1313 | struct ordered_events *oe = &session->ordered_events; | ||
1314 | struct perf_evlist *evlist = session->evlist; | ||
1315 | struct machines *machines = &session->machines; | ||
1301 | int fd = perf_data_file__fd(session->file); | 1316 | int fd = perf_data_file__fd(session->file); |
1302 | u64 head, page_offset, file_offset, file_pos, size; | 1317 | u64 head, page_offset, file_offset, file_pos, size; |
1303 | int err, mmap_prot, mmap_flags, map_idx = 0; | 1318 | int err, mmap_prot, mmap_flags, map_idx = 0; |
@@ -1391,7 +1406,7 @@ more: | |||
1391 | 1406 | ||
1392 | out: | 1407 | out: |
1393 | /* do the final flush for ordered samples */ | 1408 | /* do the final flush for ordered samples */ |
1394 | err = ordered_events__flush(session, tool, OE_FLUSH__FINAL); | 1409 | err = ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__FINAL); |
1395 | out_err: | 1410 | out_err: |
1396 | ui_progress__finish(); | 1411 | ui_progress__finish(); |
1397 | perf_tool__warn_about_errors(tool, &session->evlist->stats); | 1412 | perf_tool__warn_about_errors(tool, &session->evlist->stats); |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index fe859f379ca7..c08fa6be5bf3 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
@@ -57,7 +57,8 @@ int perf_session_queue_event(struct perf_session *s, union perf_event *event, | |||
57 | 57 | ||
58 | void perf_tool__fill_defaults(struct perf_tool *tool); | 58 | void perf_tool__fill_defaults(struct perf_tool *tool); |
59 | 59 | ||
60 | int perf_session__deliver_event(struct perf_session *session, | 60 | int machines__deliver_event(struct machines *machines, |
61 | struct perf_evlist *evlist, | ||
61 | union perf_event *event, | 62 | union perf_event *event, |
62 | struct perf_sample *sample, | 63 | struct perf_sample *sample, |
63 | struct perf_tool *tool, u64 file_offset); | 64 | struct perf_tool *tool, u64 file_offset); |