Lines Matching refs:gs

856 static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
858 if (realloc_array_as_needed(gs->vcpu, gs->vcpu_cnt, vcpu, NULL))
860 return &gs->vcpu[vcpu];
863 static int guest_session__output_bytes(struct guest_session *gs, void *buf, size_t sz)
865 ssize_t ret = writen(gs->tmp_fd, buf, sz);
875 struct guest_session *gs = container_of(tool, struct guest_session, tool);
877 return guest_session__output_bytes(gs, event, event->header.size);
880 static int guest_session__map_tid(struct guest_session *gs, u32 tid, u32 vcpu)
891 hlist_add_head(&guest_tid->node, &gs->tids[hash]);
900 struct guest_session *gs = data;
906 event->comm.pid != gs->machine_pid)
923 guest_vcpu = guest_session__vcpu(gs, vcpu);
932 return guest_session__map_tid(gs, event->comm.tid, vcpu);
935 static int host_peek_vm_comms(struct perf_session *session, struct guest_session *gs)
939 host_peek_vm_comms_cb, gs);
947 static u64 guest_session__allocate_new_id(struct guest_session *gs, struct evlist *host_evlist)
950 gs->highest_id += 1;
951 } while (!gs->highest_id || evlist__is_id_used(host_evlist, gs->highest_id));
953 return gs->highest_id;
956 static int guest_session__map_id(struct guest_session *gs, u64 id, u64 host_id, u32 vcpu)
968 hlist_add_head(&guest_id->node, &gs->heads[hash]);
992 static int guest_session__map_ids(struct guest_session *gs, struct evlist *host_evlist)
994 struct evlist *evlist = gs->session->evlist;
1010 host_id = guest_session__allocate_new_id(gs, host_evlist);
1011 ret = guest_session__map_id(gs, id, host_id, sid->cpu.cpu);
1020 static struct guest_id *guest_session__lookup_id(struct guest_session *gs, u64 id)
1027 head = &gs->heads[hash];
1045 static int guest_session__add_attr(struct guest_session *gs, struct evsel *evsel)
1047 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
1064 struct guest_id *guest_id = guest_session__lookup_id(gs, id);
1091 sid->tid = gs->vcpu[vcpu].tid;
1092 sid->machine_pid = gs->machine_pid;
1101 static int guest_session__add_attrs(struct guest_session *gs)
1103 struct evlist *evlist = gs->session->evlist;
1108 ret = guest_session__add_attr(gs, evsel);
1127 static struct guest_tid *guest_session__lookup_tid(struct guest_session *gs, u32 tid)
1134 head = &gs->tids[hash];
1190 static int guest_session__add_build_ids(struct guest_session *gs)
1192 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
1193 struct machine *machine = &gs->session->machines.host;
1201 ret = synthesize_build_id(inject, dso, gs->machine_pid);
1214 struct guest_session *gs = container_of(tool, struct guest_session, tool);
1220 return guest_session__output_bytes(gs, event, event->header.size);
1223 static int guest_session__start(struct guest_session *gs, const char *name, bool force)
1230 gs->tool.mmap = guest_session__repipe;
1231 gs->tool.mmap2 = guest_session__repipe;
1232 gs->tool.comm = guest_session__repipe;
1233 gs->tool.fork = guest_session__repipe;
1234 gs->tool.exit = guest_session__repipe;
1235 gs->tool.lost = guest_session__repipe;
1236 gs->tool.context_switch = guest_session__repipe;
1237 gs->tool.ksymbol = guest_session__ksymbol_event;
1238 gs->tool.text_poke = guest_session__repipe;
1245 gs->tool.build_id = perf_event__process_build_id;
1247 gs->tool.id_index = perf_event__process_id_index;
1249 gs->tool.ordered_events = true;
1250 gs->tool.ordering_requires_timestamps = true;
1252 gs->data.path = name;
1253 gs->data.force = force;
1254 gs->data.mode = PERF_DATA_MODE_READ;
1256 session = perf_session__new(&gs->data, &gs->tool);
1259 gs->session = session;
1265 gs->dflt_id_hdr_size = session->machines.host.id_hdr_size;
1267 gs->dflt_id = evlist__first_id(session->evlist);
1268 if (!gs->dflt_id) {
1274 gs->tmp_file_name = strdup(tmp_file_name);
1275 if (!gs->tmp_file_name)
1277 gs->tmp_fd = mkstemp(gs->tmp_file_name);
1278 if (gs->tmp_fd < 0)
1281 if (zstd_init(&gs->session->zstd_data, 0) < 0)
1288 ret = perf_session__process_events(gs->session);
1292 if (lseek(gs->tmp_fd, 0, SEEK_SET))
1312 static void guest_session__exit(struct guest_session *gs)
1314 if (gs->session) {
1315 perf_session__delete(gs->session);
1316 free_hlist(gs->heads, PERF_EVLIST__HLIST_SIZE);
1317 free_hlist(gs->tids, PERF_EVLIST__HLIST_SIZE);
1319 if (gs->tmp_file_name) {
1320 if (gs->tmp_fd >= 0)
1321 close(gs->tmp_fd);
1322 unlink(gs->tmp_file_name);
1323 zfree(&gs->tmp_file_name);
1325 zfree(&gs->vcpu);
1326 zfree(&gs->perf_data_file);
1340 static void guest_session__get_tc(struct guest_session *gs)
1342 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
1344 get_tsc_conv(&gs->host_tc, &inject->session->time_conv);
1345 get_tsc_conv(&gs->guest_tc, &gs->session->time_conv);
1348 static void guest_session__convert_time(struct guest_session *gs, u64 guest_time, u64 *host_time)
1357 if (gs->guest_tc.cap_user_time_zero)
1358 tsc = perf_time_to_tsc(guest_time, &gs->guest_tc);
1366 tsc -= gs->time_offset;
1367 tsc /= gs->time_scale;
1369 if (gs->host_tc.cap_user_time_zero)
1370 *host_time = tsc_to_perf_time(tsc, &gs->host_tc);
1375 static int guest_session__fetch(struct guest_session *gs)
1382 buf = gs->ev.event_buf;
1387 gs->ev.event_buf = buf;
1390 ret = readn(gs->tmp_fd, buf, hdr_sz);
1402 ret = readn(gs->tmp_fd, buf, hdr->size - hdr_sz);
1406 gs->ev.event = (union perf_event *)gs->ev.event_buf;
1407 gs->ev.sample.time = 0;
1414 ret = evlist__parse_sample(gs->session->evlist, gs->ev.event, &gs->ev.sample);
1420 if (!gs->have_tc) {
1421 guest_session__get_tc(gs);
1422 gs->have_tc = true;
1425 guest_session__convert_time(gs, gs->ev.sample.time, &gs->ev.sample.time);
1460 static int guest_session__inject_events(struct guest_session *gs, u64 timestamp)
1462 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
1465 if (!gs->ready)
1476 if (!gs->fetched) {
1477 ret = guest_session__fetch(gs);
1480 gs->fetched = true;
1483 ev = gs->ev.event;
1484 sample = &gs->ev.sample;
1503 id = gs->dflt_id;
1504 id_hdr_size = gs->dflt_id_hdr_size;
1506 struct evsel *evsel = evlist__id2evsel(gs->session->evlist, id);
1529 guest_id = guest_session__lookup_id(gs, id);
1541 if (sample->cpu >= gs->vcpu_cnt) {
1547 sample->cpu = gs->vcpu[sample->cpu].cpu;
1560 gs->fetched = false;
1568 static int guest_session__flush_events(struct guest_session *gs)
1570 return guest_session__inject_events(gs, -1);
1591 struct guest_session *gs = &inject->guest_session;
1598 ret = host_peek_vm_comms(session, gs);
1602 if (!gs->vcpu_cnt) {
1603 pr_err("No VCPU threads found for pid %u\n", gs->machine_pid);
1610 gs->highest_id = evlist__find_highest_id(session->evlist);
1611 ret = guest_session__map_ids(gs, session->evlist);
1615 ret = guest_session__add_attrs(gs);
1619 ret = synthesize_id_index(inject, gs->session->evlist->core.nr_entries);
1625 ret = guest_session__add_build_ids(gs);
1631 gs->ready = true;
1633 ret = guest_session__inject_events(gs, 0);
1671 struct guest_session *gs = &inject->guest_session;
1677 if (out || pid != gs->machine_pid)
1680 guest_tid = guest_session__lookup_tid(gs, tid);
1690 if (vcpu >= gs->vcpu_cnt)
1694 gs->vcpu[vcpu].cpu = sample->cpu;
1771 struct guest_session *gs = &inject->guest_session;
1785 gs->perf_data_file = strsep(&s, ",");
1786 if (!gs->perf_data_file)
1789 gs->copy_kcore_dir = has_kcore_dir(gs->perf_data_file);
1790 if (gs->copy_kcore_dir)
1796 gs->machine_pid = strtoul(tok, NULL, 0);
1800 gs->time_scale = 1;
1805 gs->time_offset = strtoull(tok, NULL, 0);
1810 gs->time_scale = strtod(tok, NULL);
1811 if (!gs->time_scale)
1952 static int guest_session__copy_kcore_dir(struct guest_session *gs)
1954 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session);
1959 gs->perf_data_file, inject->output.path, gs->machine_pid);
1976 struct guest_session *gs = &inject->guest_session;
2045 } else if (gs->perf_data_file) {
2046 char *name = gs->perf_data_file;
2078 ret = guest_session__start(gs, name, session->data->force);
2084 output_data_offset += gs->session->header.data_offset;
2098 if (gs->session) {
2103 ret = guest_session__flush_events(gs);
2149 if (gs->copy_kcore_dir) {
2150 ret = guest_session__copy_kcore_dir(gs);