aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2015-03-03 09:48:12 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-03-11 09:16:50 -0400
commitfa713a4eb9cebe5dec71b1bd11429603e17d841d (patch)
treeb51adc0b21af2b7584d455ae729de4d0c39c8ff5 /tools
parent94ac003b665fc04f13a7ab3b2be896b9b9503451 (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.c17
-rw-r--r--tools/perf/util/ordered-events.h8
-rw-r--r--tools/perf/util/session.c37
-rw-r--r--tools/perf/util/session.h3
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
156static int __ordered_events__flush(struct perf_session *s, 156static 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
207int ordered_events__flush(struct perf_session *s, struct perf_tool *tool, 208int 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
7struct perf_session; 6struct perf_tool;
7struct perf_evlist;
8struct machines;
8 9
9struct ordered_event { 10struct ordered_event {
10 u64 timestamp; 11 u64 timestamp;
@@ -40,7 +41,8 @@ struct ordered_events {
40struct ordered_event *ordered_events__new(struct ordered_events *oe, u64 timestamp, 41struct ordered_event *ordered_events__new(struct ordered_events *oe, u64 timestamp,
41 union perf_event *event); 42 union perf_event *event);
42void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event); 43void ordered_events__delete(struct ordered_events *oe, struct ordered_event *event);
43int ordered_events__flush(struct perf_session *s, struct perf_tool *tool, 44int 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);
45void ordered_events__init(struct ordered_events *oe); 47void ordered_events__init(struct ordered_events *oe);
46void ordered_events__free(struct ordered_events *oe); 48void 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
518int perf_session_queue_event(struct perf_session *s, union perf_event *event, 522int 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
889int perf_session__deliver_event(struct perf_session *session, 896int 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
995static void event_swap(union perf_event *event, bool sample_id_all) 1004static 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
1097void perf_event_header__bswap(struct perf_event_header *hdr) 1106void perf_event_header__bswap(struct perf_event_header *hdr)
@@ -1167,6 +1176,9 @@ volatile int session_done;
1167static int __perf_session__process_pipe_events(struct perf_session *session, 1176static 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;
1247done: 1259done:
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);
1250out_err: 1262out_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
1392out: 1407out:
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);
1395out_err: 1410out_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
58void perf_tool__fill_defaults(struct perf_tool *tool); 58void perf_tool__fill_defaults(struct perf_tool *tool);
59 59
60int perf_session__deliver_event(struct perf_session *session, 60int 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);