diff options
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 64a186edc7be..88dfef70c13d 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include "util.h" | 14 | #include "util.h" |
15 | #include "cpumap.h" | 15 | #include "cpumap.h" |
16 | #include "perf_regs.h" | 16 | #include "perf_regs.h" |
17 | #include "vdso.h" | ||
18 | 17 | ||
19 | static int perf_session__open(struct perf_session *session) | 18 | static int perf_session__open(struct perf_session *session) |
20 | { | 19 | { |
@@ -156,7 +155,6 @@ void perf_session__delete(struct perf_session *session) | |||
156 | if (session->file) | 155 | if (session->file) |
157 | perf_data_file__close(session->file); | 156 | perf_data_file__close(session->file); |
158 | free(session); | 157 | free(session); |
159 | vdso__exit(); | ||
160 | } | 158 | } |
161 | 159 | ||
162 | static int process_event_synth_tracing_data_stub(struct perf_tool *tool | 160 | static int process_event_synth_tracing_data_stub(struct perf_tool *tool |
@@ -511,6 +509,7 @@ static int flush_sample_queue(struct perf_session *s, | |||
511 | os->last_flush = iter->timestamp; | 509 | os->last_flush = iter->timestamp; |
512 | list_del(&iter->list); | 510 | list_del(&iter->list); |
513 | list_add(&iter->list, &os->sample_cache); | 511 | list_add(&iter->list, &os->sample_cache); |
512 | os->nr_samples--; | ||
514 | 513 | ||
515 | if (show_progress) | 514 | if (show_progress) |
516 | ui_progress__update(&prog, 1); | 515 | ui_progress__update(&prog, 1); |
@@ -523,8 +522,6 @@ static int flush_sample_queue(struct perf_session *s, | |||
523 | list_entry(head->prev, struct sample_queue, list); | 522 | list_entry(head->prev, struct sample_queue, list); |
524 | } | 523 | } |
525 | 524 | ||
526 | os->nr_samples = 0; | ||
527 | |||
528 | return 0; | 525 | return 0; |
529 | } | 526 | } |
530 | 527 | ||
@@ -994,8 +991,10 @@ static int perf_session_deliver_event(struct perf_session *session, | |||
994 | } | 991 | } |
995 | } | 992 | } |
996 | 993 | ||
997 | static int perf_session__process_user_event(struct perf_session *session, union perf_event *event, | 994 | static s64 perf_session__process_user_event(struct perf_session *session, |
998 | struct perf_tool *tool, u64 file_offset) | 995 | union perf_event *event, |
996 | struct perf_tool *tool, | ||
997 | u64 file_offset) | ||
999 | { | 998 | { |
1000 | int fd = perf_data_file__fd(session->file); | 999 | int fd = perf_data_file__fd(session->file); |
1001 | int err; | 1000 | int err; |
@@ -1037,7 +1036,7 @@ static void event_swap(union perf_event *event, bool sample_id_all) | |||
1037 | swap(event, sample_id_all); | 1036 | swap(event, sample_id_all); |
1038 | } | 1037 | } |
1039 | 1038 | ||
1040 | static int perf_session__process_event(struct perf_session *session, | 1039 | static s64 perf_session__process_event(struct perf_session *session, |
1041 | union perf_event *event, | 1040 | union perf_event *event, |
1042 | struct perf_tool *tool, | 1041 | struct perf_tool *tool, |
1043 | u64 file_offset) | 1042 | u64 file_offset) |
@@ -1083,13 +1082,14 @@ void perf_event_header__bswap(struct perf_event_header *hdr) | |||
1083 | 1082 | ||
1084 | struct thread *perf_session__findnew(struct perf_session *session, pid_t pid) | 1083 | struct thread *perf_session__findnew(struct perf_session *session, pid_t pid) |
1085 | { | 1084 | { |
1086 | return machine__findnew_thread(&session->machines.host, 0, pid); | 1085 | return machine__findnew_thread(&session->machines.host, -1, pid); |
1087 | } | 1086 | } |
1088 | 1087 | ||
1089 | static struct thread *perf_session__register_idle_thread(struct perf_session *session) | 1088 | static struct thread *perf_session__register_idle_thread(struct perf_session *session) |
1090 | { | 1089 | { |
1091 | struct thread *thread = perf_session__findnew(session, 0); | 1090 | struct thread *thread; |
1092 | 1091 | ||
1092 | thread = machine__findnew_thread(&session->machines.host, 0, 0); | ||
1093 | if (thread == NULL || thread__set_comm(thread, "swapper", 0)) { | 1093 | if (thread == NULL || thread__set_comm(thread, "swapper", 0)) { |
1094 | pr_err("problem inserting idle task.\n"); | 1094 | pr_err("problem inserting idle task.\n"); |
1095 | thread = NULL; | 1095 | thread = NULL; |
@@ -1147,7 +1147,7 @@ static int __perf_session__process_pipe_events(struct perf_session *session, | |||
1147 | union perf_event *event; | 1147 | union perf_event *event; |
1148 | uint32_t size, cur_size = 0; | 1148 | uint32_t size, cur_size = 0; |
1149 | void *buf = NULL; | 1149 | void *buf = NULL; |
1150 | int skip = 0; | 1150 | s64 skip = 0; |
1151 | u64 head; | 1151 | u64 head; |
1152 | ssize_t err; | 1152 | ssize_t err; |
1153 | void *p; | 1153 | void *p; |
@@ -1276,13 +1276,13 @@ int __perf_session__process_events(struct perf_session *session, | |||
1276 | u64 file_size, struct perf_tool *tool) | 1276 | u64 file_size, struct perf_tool *tool) |
1277 | { | 1277 | { |
1278 | int fd = perf_data_file__fd(session->file); | 1278 | int fd = perf_data_file__fd(session->file); |
1279 | u64 head, page_offset, file_offset, file_pos; | 1279 | u64 head, page_offset, file_offset, file_pos, size; |
1280 | int err, mmap_prot, mmap_flags, map_idx = 0; | 1280 | int err, mmap_prot, mmap_flags, map_idx = 0; |
1281 | size_t mmap_size; | 1281 | size_t mmap_size; |
1282 | char *buf, *mmaps[NUM_MMAPS]; | 1282 | char *buf, *mmaps[NUM_MMAPS]; |
1283 | union perf_event *event; | 1283 | union perf_event *event; |
1284 | uint32_t size; | ||
1285 | struct ui_progress prog; | 1284 | struct ui_progress prog; |
1285 | s64 skip; | ||
1286 | 1286 | ||
1287 | perf_tool__fill_defaults(tool); | 1287 | perf_tool__fill_defaults(tool); |
1288 | 1288 | ||
@@ -1296,8 +1296,10 @@ int __perf_session__process_events(struct perf_session *session, | |||
1296 | ui_progress__init(&prog, file_size, "Processing events..."); | 1296 | ui_progress__init(&prog, file_size, "Processing events..."); |
1297 | 1297 | ||
1298 | mmap_size = MMAP_SIZE; | 1298 | mmap_size = MMAP_SIZE; |
1299 | if (mmap_size > file_size) | 1299 | if (mmap_size > file_size) { |
1300 | mmap_size = file_size; | 1300 | mmap_size = file_size; |
1301 | session->one_mmap = true; | ||
1302 | } | ||
1301 | 1303 | ||
1302 | memset(mmaps, 0, sizeof(mmaps)); | 1304 | memset(mmaps, 0, sizeof(mmaps)); |
1303 | 1305 | ||
@@ -1319,6 +1321,10 @@ remap: | |||
1319 | mmaps[map_idx] = buf; | 1321 | mmaps[map_idx] = buf; |
1320 | map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1); | 1322 | map_idx = (map_idx + 1) & (ARRAY_SIZE(mmaps) - 1); |
1321 | file_pos = file_offset + head; | 1323 | file_pos = file_offset + head; |
1324 | if (session->one_mmap) { | ||
1325 | session->one_mmap_addr = buf; | ||
1326 | session->one_mmap_offset = file_offset; | ||
1327 | } | ||
1322 | 1328 | ||
1323 | more: | 1329 | more: |
1324 | event = fetch_mmaped_event(session, head, mmap_size, buf); | 1330 | event = fetch_mmaped_event(session, head, mmap_size, buf); |
@@ -1337,7 +1343,8 @@ more: | |||
1337 | size = event->header.size; | 1343 | size = event->header.size; |
1338 | 1344 | ||
1339 | if (size < sizeof(struct perf_event_header) || | 1345 | if (size < sizeof(struct perf_event_header) || |
1340 | perf_session__process_event(session, event, tool, file_pos) < 0) { | 1346 | (skip = perf_session__process_event(session, event, tool, file_pos)) |
1347 | < 0) { | ||
1341 | pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", | 1348 | pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n", |
1342 | file_offset + head, event->header.size, | 1349 | file_offset + head, event->header.size, |
1343 | event->header.type); | 1350 | event->header.type); |
@@ -1345,6 +1352,9 @@ more: | |||
1345 | goto out_err; | 1352 | goto out_err; |
1346 | } | 1353 | } |
1347 | 1354 | ||
1355 | if (skip) | ||
1356 | size += skip; | ||
1357 | |||
1348 | head += size; | 1358 | head += size; |
1349 | file_pos += size; | 1359 | file_pos += size; |
1350 | 1360 | ||
@@ -1364,6 +1374,7 @@ out_err: | |||
1364 | ui_progress__finish(); | 1374 | ui_progress__finish(); |
1365 | perf_session__warn_about_errors(session, tool); | 1375 | perf_session__warn_about_errors(session, tool); |
1366 | perf_session_free_sample_buffers(session); | 1376 | perf_session_free_sample_buffers(session); |
1377 | session->one_mmap = false; | ||
1367 | return err; | 1378 | return err; |
1368 | } | 1379 | } |
1369 | 1380 | ||