aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c39
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
19static int perf_session__open(struct perf_session *session) 18static 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
162static int process_event_synth_tracing_data_stub(struct perf_tool *tool 160static 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
997static int perf_session__process_user_event(struct perf_session *session, union perf_event *event, 994static 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
1040static int perf_session__process_event(struct perf_session *session, 1039static 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
1084struct thread *perf_session__findnew(struct perf_session *session, pid_t pid) 1083struct 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
1089static struct thread *perf_session__register_idle_thread(struct perf_session *session) 1088static 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
1323more: 1329more:
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