Lines Matching refs:gs
840 static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu) in guest_session__vcpu() argument
842 if (realloc_array_as_needed(gs->vcpu, gs->vcpu_cnt, vcpu, NULL)) in guest_session__vcpu()
844 return &gs->vcpu[vcpu]; in guest_session__vcpu()
847 static int guest_session__output_bytes(struct guest_session *gs, void *buf, size_t sz) in guest_session__output_bytes() argument
849 ssize_t ret = writen(gs->tmp_fd, buf, sz); in guest_session__output_bytes()
859 struct guest_session *gs = container_of(tool, struct guest_session, tool); in guest_session__repipe() local
861 return guest_session__output_bytes(gs, event, event->header.size); in guest_session__repipe()
864 static int guest_session__map_tid(struct guest_session *gs, u32 tid, u32 vcpu) in guest_session__map_tid() argument
875 hlist_add_head(&guest_tid->node, &gs->tids[hash]); in guest_session__map_tid()
884 struct guest_session *gs = data; in host_peek_vm_comms_cb() local
890 event->comm.pid != gs->machine_pid) in host_peek_vm_comms_cb()
907 guest_vcpu = guest_session__vcpu(gs, vcpu); in host_peek_vm_comms_cb()
916 return guest_session__map_tid(gs, event->comm.tid, vcpu); in host_peek_vm_comms_cb()
919 static int host_peek_vm_comms(struct perf_session *session, struct guest_session *gs) in host_peek_vm_comms() argument
923 host_peek_vm_comms_cb, gs); in host_peek_vm_comms()
931 static u64 guest_session__allocate_new_id(struct guest_session *gs, struct evlist *host_evlist) in guest_session__allocate_new_id() argument
934 gs->highest_id += 1; in guest_session__allocate_new_id()
935 } while (!gs->highest_id || evlist__is_id_used(host_evlist, gs->highest_id)); in guest_session__allocate_new_id()
937 return gs->highest_id; in guest_session__allocate_new_id()
940 static int guest_session__map_id(struct guest_session *gs, u64 id, u64 host_id, u32 vcpu) in guest_session__map_id() argument
952 hlist_add_head(&guest_id->node, &gs->heads[hash]); in guest_session__map_id()
976 static int guest_session__map_ids(struct guest_session *gs, struct evlist *host_evlist) in guest_session__map_ids() argument
978 struct evlist *evlist = gs->session->evlist; in guest_session__map_ids()
994 host_id = guest_session__allocate_new_id(gs, host_evlist); in guest_session__map_ids()
995 ret = guest_session__map_id(gs, id, host_id, sid->cpu.cpu); in guest_session__map_ids()
1004 static struct guest_id *guest_session__lookup_id(struct guest_session *gs, u64 id) in guest_session__lookup_id() argument
1011 head = &gs->heads[hash]; in guest_session__lookup_id()
1029 static int guest_session__add_attr(struct guest_session *gs, struct evsel *evsel) in guest_session__add_attr() argument
1031 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session); in guest_session__add_attr()
1048 struct guest_id *guest_id = guest_session__lookup_id(gs, id); in guest_session__add_attr()
1075 sid->tid = gs->vcpu[vcpu].tid; in guest_session__add_attr()
1076 sid->machine_pid = gs->machine_pid; in guest_session__add_attr()
1085 static int guest_session__add_attrs(struct guest_session *gs) in guest_session__add_attrs() argument
1087 struct evlist *evlist = gs->session->evlist; in guest_session__add_attrs()
1092 ret = guest_session__add_attr(gs, evsel); in guest_session__add_attrs()
1111 static struct guest_tid *guest_session__lookup_tid(struct guest_session *gs, u32 tid) in guest_session__lookup_tid() argument
1118 head = &gs->tids[hash]; in guest_session__lookup_tid()
1174 static int guest_session__add_build_ids(struct guest_session *gs) in guest_session__add_build_ids() argument
1176 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session); in guest_session__add_build_ids()
1177 struct machine *machine = &gs->session->machines.host; in guest_session__add_build_ids()
1185 ret = synthesize_build_id(inject, dso, gs->machine_pid); in guest_session__add_build_ids()
1198 struct guest_session *gs = container_of(tool, struct guest_session, tool); in guest_session__ksymbol_event() local
1204 return guest_session__output_bytes(gs, event, event->header.size); in guest_session__ksymbol_event()
1207 static int guest_session__start(struct guest_session *gs, const char *name, bool force) in guest_session__start() argument
1214 gs->tool.mmap = guest_session__repipe; in guest_session__start()
1215 gs->tool.mmap2 = guest_session__repipe; in guest_session__start()
1216 gs->tool.comm = guest_session__repipe; in guest_session__start()
1217 gs->tool.fork = guest_session__repipe; in guest_session__start()
1218 gs->tool.exit = guest_session__repipe; in guest_session__start()
1219 gs->tool.lost = guest_session__repipe; in guest_session__start()
1220 gs->tool.context_switch = guest_session__repipe; in guest_session__start()
1221 gs->tool.ksymbol = guest_session__ksymbol_event; in guest_session__start()
1222 gs->tool.text_poke = guest_session__repipe; in guest_session__start()
1229 gs->tool.build_id = perf_event__process_build_id; in guest_session__start()
1231 gs->tool.id_index = perf_event__process_id_index; in guest_session__start()
1233 gs->tool.ordered_events = true; in guest_session__start()
1234 gs->tool.ordering_requires_timestamps = true; in guest_session__start()
1236 gs->data.path = name; in guest_session__start()
1237 gs->data.force = force; in guest_session__start()
1238 gs->data.mode = PERF_DATA_MODE_READ; in guest_session__start()
1240 session = perf_session__new(&gs->data, &gs->tool); in guest_session__start()
1243 gs->session = session; in guest_session__start()
1249 gs->dflt_id_hdr_size = session->machines.host.id_hdr_size; in guest_session__start()
1251 gs->dflt_id = evlist__first_id(session->evlist); in guest_session__start()
1252 if (!gs->dflt_id) { in guest_session__start()
1258 gs->tmp_file_name = strdup(tmp_file_name); in guest_session__start()
1259 if (!gs->tmp_file_name) in guest_session__start()
1261 gs->tmp_fd = mkstemp(gs->tmp_file_name); in guest_session__start()
1262 if (gs->tmp_fd < 0) in guest_session__start()
1265 if (zstd_init(&gs->session->zstd_data, 0) < 0) in guest_session__start()
1272 ret = perf_session__process_events(gs->session); in guest_session__start()
1276 if (lseek(gs->tmp_fd, 0, SEEK_SET)) in guest_session__start()
1296 static void guest_session__exit(struct guest_session *gs) in guest_session__exit() argument
1298 if (gs->session) { in guest_session__exit()
1299 perf_session__delete(gs->session); in guest_session__exit()
1300 free_hlist(gs->heads, PERF_EVLIST__HLIST_SIZE); in guest_session__exit()
1301 free_hlist(gs->tids, PERF_EVLIST__HLIST_SIZE); in guest_session__exit()
1303 if (gs->tmp_file_name) { in guest_session__exit()
1304 if (gs->tmp_fd >= 0) in guest_session__exit()
1305 close(gs->tmp_fd); in guest_session__exit()
1306 unlink(gs->tmp_file_name); in guest_session__exit()
1307 free(gs->tmp_file_name); in guest_session__exit()
1309 free(gs->vcpu); in guest_session__exit()
1310 free(gs->perf_data_file); in guest_session__exit()
1324 static void guest_session__get_tc(struct guest_session *gs) in guest_session__get_tc() argument
1326 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session); in guest_session__get_tc()
1328 get_tsc_conv(&gs->host_tc, &inject->session->time_conv); in guest_session__get_tc()
1329 get_tsc_conv(&gs->guest_tc, &gs->session->time_conv); in guest_session__get_tc()
1332 static void guest_session__convert_time(struct guest_session *gs, u64 guest_time, u64 *host_time) in guest_session__convert_time() argument
1341 if (gs->guest_tc.cap_user_time_zero) in guest_session__convert_time()
1342 tsc = perf_time_to_tsc(guest_time, &gs->guest_tc); in guest_session__convert_time()
1350 tsc -= gs->time_offset; in guest_session__convert_time()
1351 tsc /= gs->time_scale; in guest_session__convert_time()
1353 if (gs->host_tc.cap_user_time_zero) in guest_session__convert_time()
1354 *host_time = tsc_to_perf_time(tsc, &gs->host_tc); in guest_session__convert_time()
1359 static int guest_session__fetch(struct guest_session *gs) in guest_session__fetch() argument
1361 void *buf = gs->ev.event_buf; in guest_session__fetch()
1366 ret = readn(gs->tmp_fd, buf, hdr_sz); in guest_session__fetch()
1378 ret = readn(gs->tmp_fd, buf, hdr->size - hdr_sz); in guest_session__fetch()
1382 gs->ev.event = (union perf_event *)gs->ev.event_buf; in guest_session__fetch()
1383 gs->ev.sample.time = 0; in guest_session__fetch()
1390 ret = evlist__parse_sample(gs->session->evlist, gs->ev.event, &gs->ev.sample); in guest_session__fetch()
1396 if (!gs->have_tc) { in guest_session__fetch()
1397 guest_session__get_tc(gs); in guest_session__fetch()
1398 gs->have_tc = true; in guest_session__fetch()
1401 guest_session__convert_time(gs, gs->ev.sample.time, &gs->ev.sample.time); in guest_session__fetch()
1436 static int guest_session__inject_events(struct guest_session *gs, u64 timestamp) in guest_session__inject_events() argument
1438 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session); in guest_session__inject_events()
1441 if (!gs->ready) in guest_session__inject_events()
1452 if (!gs->fetched) { in guest_session__inject_events()
1453 ret = guest_session__fetch(gs); in guest_session__inject_events()
1456 gs->fetched = true; in guest_session__inject_events()
1459 ev = gs->ev.event; in guest_session__inject_events()
1460 sample = &gs->ev.sample; in guest_session__inject_events()
1479 id = gs->dflt_id; in guest_session__inject_events()
1480 id_hdr_size = gs->dflt_id_hdr_size; in guest_session__inject_events()
1482 struct evsel *evsel = evlist__id2evsel(gs->session->evlist, id); in guest_session__inject_events()
1505 guest_id = guest_session__lookup_id(gs, id); in guest_session__inject_events()
1517 if (sample->cpu >= gs->vcpu_cnt) { in guest_session__inject_events()
1523 sample->cpu = gs->vcpu[sample->cpu].cpu; in guest_session__inject_events()
1536 gs->fetched = false; in guest_session__inject_events()
1544 static int guest_session__flush_events(struct guest_session *gs) in guest_session__flush_events() argument
1546 return guest_session__inject_events(gs, -1); in guest_session__flush_events()
1567 struct guest_session *gs = &inject->guest_session; in host__finished_init() local
1574 ret = host_peek_vm_comms(session, gs); in host__finished_init()
1578 if (!gs->vcpu_cnt) { in host__finished_init()
1579 pr_err("No VCPU threads found for pid %u\n", gs->machine_pid); in host__finished_init()
1586 gs->highest_id = evlist__find_highest_id(session->evlist); in host__finished_init()
1587 ret = guest_session__map_ids(gs, session->evlist); in host__finished_init()
1591 ret = guest_session__add_attrs(gs); in host__finished_init()
1595 ret = synthesize_id_index(inject, gs->session->evlist->core.nr_entries); in host__finished_init()
1601 ret = guest_session__add_build_ids(gs); in host__finished_init()
1607 gs->ready = true; in host__finished_init()
1609 ret = guest_session__inject_events(gs, 0); in host__finished_init()
1647 struct guest_session *gs = &inject->guest_session; in host__context_switch() local
1653 if (out || pid != gs->machine_pid) in host__context_switch()
1656 guest_tid = guest_session__lookup_tid(gs, tid); in host__context_switch()
1666 if (vcpu >= gs->vcpu_cnt) in host__context_switch()
1670 gs->vcpu[vcpu].cpu = sample->cpu; in host__context_switch()
1747 struct guest_session *gs = &inject->guest_session; in parse_guest_data() local
1761 gs->perf_data_file = strsep(&s, ","); in parse_guest_data()
1762 if (!gs->perf_data_file) in parse_guest_data()
1765 gs->copy_kcore_dir = has_kcore_dir(gs->perf_data_file); in parse_guest_data()
1766 if (gs->copy_kcore_dir) in parse_guest_data()
1772 gs->machine_pid = strtoul(tok, NULL, 0); in parse_guest_data()
1776 gs->time_scale = 1; in parse_guest_data()
1781 gs->time_offset = strtoull(tok, NULL, 0); in parse_guest_data()
1786 gs->time_scale = strtod(tok, NULL); in parse_guest_data()
1787 if (!gs->time_scale) in parse_guest_data()
1928 static int guest_session__copy_kcore_dir(struct guest_session *gs) in guest_session__copy_kcore_dir() argument
1930 struct perf_inject *inject = container_of(gs, struct perf_inject, guest_session); in guest_session__copy_kcore_dir()
1935 gs->perf_data_file, inject->output.path, gs->machine_pid); in guest_session__copy_kcore_dir()
1952 struct guest_session *gs = &inject->guest_session; in __cmd_inject() local
2017 } else if (gs->perf_data_file) { in __cmd_inject()
2018 char *name = gs->perf_data_file; in __cmd_inject()
2050 ret = guest_session__start(gs, name, session->data->force); in __cmd_inject()
2056 output_data_offset += gs->session->header.data_offset; in __cmd_inject()
2070 if (gs->session) { in __cmd_inject()
2075 ret = guest_session__flush_events(gs); in __cmd_inject()
2121 if (gs->copy_kcore_dir) { in __cmd_inject()
2122 ret = guest_session__copy_kcore_dir(gs); in __cmd_inject()