Lines Matching refs:kvm

72 static const char *get_exit_reason(struct perf_kvm_stat *kvm,  in get_exit_reason()  argument
83 (unsigned long long)exit_code, kvm->exit_reasons_isa); in get_exit_reason()
87 void exit_event_decode_key(struct perf_kvm_stat *kvm, in exit_event_decode_key() argument
91 const char *exit_reason = get_exit_reason(kvm, key->exit_reasons, in exit_event_decode_key()
97 static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) in register_kvm_events_ops() argument
102 if (!strcmp(events_ops->name, kvm->report_event)) { in register_kvm_events_ops()
103 kvm->events_ops = events_ops->ops; in register_kvm_events_ops()
118 static void init_kvm_event_record(struct perf_kvm_stat *kvm) in init_kvm_event_record() argument
123 INIT_LIST_HEAD(&kvm->kvm_events_cache[i]); in init_kvm_event_record()
195 static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm, in find_create_kvm_event() argument
203 head = &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)]; in find_create_kvm_event()
217 static bool handle_begin_event(struct perf_kvm_stat *kvm, in handle_begin_event() argument
224 event = find_create_kvm_event(kvm, key); in handle_begin_event()
264 static bool is_child_event(struct perf_kvm_stat *kvm, in is_child_event() argument
271 child_ops = kvm->events_ops->child_ops; in is_child_event()
286 static bool handle_child_event(struct perf_kvm_stat *kvm, in handle_child_event() argument
294 event = find_create_kvm_event(kvm, key); in handle_child_event()
312 static bool handle_end_event(struct perf_kvm_stat *kvm, in handle_end_event() argument
321 if (kvm->trace_vcpu == -1) in handle_end_event()
343 event = find_create_kvm_event(kvm, key); in handle_end_event()
359 if (kvm->duration && time_diff > kvm->duration) { in handle_end_event()
362 kvm->events_ops->decode_key(kvm, &event->key, decode); in handle_end_event()
395 static bool handle_kvm_event(struct perf_kvm_stat *kvm, in handle_kvm_event() argument
402 .exit_reasons = kvm->exit_reasons }; in handle_kvm_event()
409 if ((kvm->trace_vcpu != -1) && in handle_kvm_event()
410 (kvm->trace_vcpu != vcpu_record->vcpu_id)) in handle_kvm_event()
413 if (kvm->events_ops->is_begin_event(evsel, sample, &key)) in handle_kvm_event()
414 return handle_begin_event(kvm, vcpu_record, &key, sample->time); in handle_kvm_event()
416 if (is_child_event(kvm, evsel, sample, &key)) in handle_kvm_event()
417 return handle_child_event(kvm, vcpu_record, &key, sample); in handle_kvm_event()
419 if (kvm->events_ops->is_end_event(evsel, sample, &key)) in handle_kvm_event()
420 return handle_end_event(kvm, vcpu_record, &key, sample); in handle_kvm_event()
461 static bool select_key(struct perf_kvm_stat *kvm) in select_key() argument
466 if (!strcmp(keys[i].name, kvm->sort_key)) { in select_key()
467 kvm->compare = keys[i].key; in select_key()
472 pr_err("Unknown compare key:%s\n", kvm->sort_key); in select_key()
498 update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event) in update_total_count() argument
500 int vcpu = kvm->trace_vcpu; in update_total_count()
502 kvm->total_count += get_event_count(event, vcpu); in update_total_count()
503 kvm->total_time += get_event_time(event, vcpu); in update_total_count()
511 static void sort_result(struct perf_kvm_stat *kvm) in sort_result() argument
514 int vcpu = kvm->trace_vcpu; in sort_result()
518 list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) { in sort_result()
520 update_total_count(kvm, event); in sort_result()
521 insert_to_result(&kvm->result, event, in sort_result()
522 kvm->compare, vcpu); in sort_result()
540 static void print_vcpu_info(struct perf_kvm_stat *kvm) in print_vcpu_info() argument
542 int vcpu = kvm->trace_vcpu; in print_vcpu_info()
546 if (kvm->opts.target.system_wide) in print_vcpu_info()
548 else if (kvm->opts.target.pid) in print_vcpu_info()
549 pr_info("pid(s) %s, ", kvm->opts.target.pid); in print_vcpu_info()
575 static void print_result(struct perf_kvm_stat *kvm) in print_result() argument
579 int vcpu = kvm->trace_vcpu; in print_result()
581 if (kvm->live) { in print_result()
587 print_vcpu_info(kvm); in print_result()
588 pr_info("%*s ", DECODE_STR_LEN, kvm->events_ops->name); in print_result()
598 while ((event = pop_from_result(&kvm->result))) { in print_result()
606 kvm->events_ops->decode_key(kvm, &event->key, decode); in print_result()
609 pr_info("%8.2f%% ", (double)ecount / kvm->total_count * 100); in print_result()
610 pr_info("%8.2f%% ", (double)etime / kvm->total_time * 100); in print_result()
619 kvm->total_count, kvm->total_time / 1e3); in print_result()
621 if (kvm->lost_events) in print_result()
622 pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events); in print_result()
631 struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, tool); in process_lost_event() local
633 kvm->lost_events++; in process_lost_event()
638 static bool skip_sample(struct perf_kvm_stat *kvm, in skip_sample() argument
641 if (kvm->pid_list && intlist__find(kvm->pid_list, sample->pid) == NULL) in skip_sample()
655 struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, in process_sample_event() local
658 if (skip_sample(kvm, sample)) in process_sample_event()
668 if (!handle_kvm_event(kvm, thread, evsel, sample)) in process_sample_event()
675 static int cpu_isa_config(struct perf_kvm_stat *kvm) in cpu_isa_config() argument
680 if (kvm->live) { in cpu_isa_config()
688 cpuid = kvm->session->header.env.cpuid; in cpu_isa_config()
695 err = cpu_isa_init(kvm, cpuid); in cpu_isa_config()
718 static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx, in perf_kvm__mmap_read_idx() argument
727 while ((event = perf_evlist__mmap_read(kvm->evlist, idx)) != NULL) { in perf_kvm__mmap_read_idx()
728 err = perf_evlist__parse_sample(kvm->evlist, event, &sample); in perf_kvm__mmap_read_idx()
730 perf_evlist__mmap_consume(kvm->evlist, idx); in perf_kvm__mmap_read_idx()
735 err = perf_session__queue_event(kvm->session, event, &sample, 0); in perf_kvm__mmap_read_idx()
740 perf_evlist__mmap_consume(kvm->evlist, idx); in perf_kvm__mmap_read_idx()
760 static int perf_kvm__mmap_read(struct perf_kvm_stat *kvm) in perf_kvm__mmap_read() argument
766 for (i = 0; i < kvm->evlist->nr_mmaps; i++) { in perf_kvm__mmap_read()
767 n = perf_kvm__mmap_read_idx(kvm, i, &mmap_time); in perf_kvm__mmap_read()
788 struct ordered_events *oe = &kvm->session->ordered_events; in perf_kvm__mmap_read()
793 if (kvm->lost_events) in perf_kvm__mmap_read()
795 kvm->lost_events); in perf_kvm__mmap_read()
810 static int perf_kvm__timerfd_create(struct perf_kvm_stat *kvm) in perf_kvm__timerfd_create() argument
815 kvm->timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); in perf_kvm__timerfd_create()
816 if (kvm->timerfd < 0) { in perf_kvm__timerfd_create()
821 new_value.it_value.tv_sec = kvm->display_time; in perf_kvm__timerfd_create()
823 new_value.it_interval.tv_sec = kvm->display_time; in perf_kvm__timerfd_create()
826 if (timerfd_settime(kvm->timerfd, 0, &new_value, NULL) != 0) { in perf_kvm__timerfd_create()
828 close(kvm->timerfd); in perf_kvm__timerfd_create()
837 static int perf_kvm__handle_timerfd(struct perf_kvm_stat *kvm) in perf_kvm__handle_timerfd() argument
842 rc = read(kvm->timerfd, &c, sizeof(uint64_t)); in perf_kvm__handle_timerfd()
860 sort_result(kvm); in perf_kvm__handle_timerfd()
861 print_result(kvm); in perf_kvm__handle_timerfd()
864 clear_events_cache_stats(kvm->kvm_events_cache); in perf_kvm__handle_timerfd()
865 kvm->total_count = 0; in perf_kvm__handle_timerfd()
866 kvm->total_time = 0; in perf_kvm__handle_timerfd()
867 kvm->lost_events = 0; in perf_kvm__handle_timerfd()
901 static int kvm_events_live_report(struct perf_kvm_stat *kvm) in kvm_events_live_report() argument
907 kvm->live = true; in kvm_events_live_report()
909 ret = cpu_isa_config(kvm); in kvm_events_live_report()
913 if (!verify_vcpu(kvm->trace_vcpu) || in kvm_events_live_report()
914 !select_key(kvm) || in kvm_events_live_report()
915 !register_kvm_events_ops(kvm)) { in kvm_events_live_report()
920 init_kvm_event_record(kvm); in kvm_events_live_report()
926 if (perf_kvm__timerfd_create(kvm) < 0) { in kvm_events_live_report()
931 if (perf_evlist__add_pollfd(kvm->evlist, kvm->timerfd) < 0) in kvm_events_live_report()
934 nr_stdin = perf_evlist__add_pollfd(kvm->evlist, fileno(stdin)); in kvm_events_live_report()
942 perf_evlist__enable(kvm->evlist); in kvm_events_live_report()
945 struct fdarray *fda = &kvm->evlist->pollfd; in kvm_events_live_report()
948 rc = perf_kvm__mmap_read(kvm); in kvm_events_live_report()
952 err = perf_kvm__handle_timerfd(kvm); in kvm_events_live_report()
963 perf_evlist__disable(kvm->evlist); in kvm_events_live_report()
966 sort_result(kvm); in kvm_events_live_report()
967 print_result(kvm); in kvm_events_live_report()
971 if (kvm->timerfd >= 0) in kvm_events_live_report()
972 close(kvm->timerfd); in kvm_events_live_report()
978 static int kvm_live_open_events(struct perf_kvm_stat *kvm) in kvm_live_open_events() argument
982 struct perf_evlist *evlist = kvm->evlist; in kvm_live_open_events()
985 perf_evlist__config(evlist, &kvm->opts); in kvm_live_open_events()
1025 if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) { in kvm_live_open_events()
1039 static int read_events(struct perf_kvm_stat *kvm) in read_events() argument
1049 .path = kvm->file_name, in read_events()
1051 .force = kvm->force, in read_events()
1054 kvm->tool = eops; in read_events()
1055 kvm->session = perf_session__new(&file, false, &kvm->tool); in read_events()
1056 if (!kvm->session) { in read_events()
1061 symbol__init(&kvm->session->header.env); in read_events()
1063 if (!perf_session__has_traces(kvm->session, "kvm record")) { in read_events()
1072 ret = cpu_isa_config(kvm); in read_events()
1076 ret = perf_session__process_events(kvm->session); in read_events()
1079 perf_session__delete(kvm->session); in read_events()
1083 static int parse_target_str(struct perf_kvm_stat *kvm) in parse_target_str() argument
1085 if (kvm->opts.target.pid) { in parse_target_str()
1086 kvm->pid_list = intlist__new(kvm->opts.target.pid); in parse_target_str()
1087 if (kvm->pid_list == NULL) { in parse_target_str()
1096 static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm) in kvm_events_report_vcpu() argument
1099 int vcpu = kvm->trace_vcpu; in kvm_events_report_vcpu()
1101 if (parse_target_str(kvm) != 0) in kvm_events_report_vcpu()
1107 if (!select_key(kvm)) in kvm_events_report_vcpu()
1110 if (!register_kvm_events_ops(kvm)) in kvm_events_report_vcpu()
1113 init_kvm_event_record(kvm); in kvm_events_report_vcpu()
1116 ret = read_events(kvm); in kvm_events_report_vcpu()
1120 sort_result(kvm); in kvm_events_report_vcpu()
1121 print_result(kvm); in kvm_events_report_vcpu()
1136 kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv) in kvm_events_record() argument
1172 rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name); in kvm_events_record()
1202 kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv) in kvm_events_report() argument
1205 OPT_STRING(0, "event", &kvm->report_event, "report event", in kvm_events_report()
1208 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu, in kvm_events_report()
1210 OPT_STRING('k', "key", &kvm->sort_key, "sort-key", in kvm_events_report()
1213 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid", in kvm_events_report()
1215 OPT_BOOLEAN('f', "force", &kvm->force, "don't complain, do it"), in kvm_events_report()
1233 if (!kvm->opts.target.pid) in kvm_events_report()
1234 kvm->opts.target.system_wide = true; in kvm_events_report()
1236 return kvm_events_report_vcpu(kvm); in kvm_events_report()
1289 static int kvm_events_live(struct perf_kvm_stat *kvm, in kvm_events_live() argument
1296 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid", in kvm_events_live()
1298 OPT_CALLBACK('m', "mmap-pages", &kvm->opts.mmap_pages, "pages", in kvm_events_live()
1303 OPT_BOOLEAN('a', "all-cpus", &kvm->opts.target.system_wide, in kvm_events_live()
1305 OPT_UINTEGER('d', "display", &kvm->display_time, in kvm_events_live()
1307 OPT_STRING(0, "event", &kvm->report_event, "report event", in kvm_events_live()
1310 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu, in kvm_events_live()
1312 OPT_STRING('k', "key", &kvm->sort_key, "sort-key", in kvm_events_live()
1315 OPT_U64(0, "duration", &kvm->duration, in kvm_events_live()
1319 OPT_UINTEGER(0, "proc-map-timeout", &kvm->opts.proc_map_timeout, in kvm_events_live()
1333 kvm->tool.sample = process_sample_event; in kvm_events_live()
1334 kvm->tool.comm = perf_event__process_comm; in kvm_events_live()
1335 kvm->tool.exit = perf_event__process_exit; in kvm_events_live()
1336 kvm->tool.fork = perf_event__process_fork; in kvm_events_live()
1337 kvm->tool.lost = process_lost_event; in kvm_events_live()
1338 kvm->tool.ordered_events = true; in kvm_events_live()
1339 perf_tool__fill_defaults(&kvm->tool); in kvm_events_live()
1342 kvm->display_time = 1; in kvm_events_live()
1343 kvm->opts.user_interval = 1; in kvm_events_live()
1344 kvm->opts.mmap_pages = 512; in kvm_events_live()
1345 kvm->opts.target.uses_mmap = false; in kvm_events_live()
1346 kvm->opts.target.uid_str = NULL; in kvm_events_live()
1347 kvm->opts.target.uid = UINT_MAX; in kvm_events_live()
1348 kvm->opts.proc_map_timeout = 500; in kvm_events_live()
1363 kvm->duration *= NSEC_PER_USEC; /* convert usec to nsec */ in kvm_events_live()
1368 err = target__validate(&kvm->opts.target); in kvm_events_live()
1370 target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ); in kvm_events_live()
1374 if (target__none(&kvm->opts.target)) in kvm_events_live()
1375 kvm->opts.target.system_wide = true; in kvm_events_live()
1381 kvm->evlist = kvm_live_event_list(); in kvm_events_live()
1382 if (kvm->evlist == NULL) { in kvm_events_live()
1387 symbol_conf.nr_events = kvm->evlist->nr_entries; in kvm_events_live()
1389 if (perf_evlist__create_maps(kvm->evlist, &kvm->opts.target) < 0) in kvm_events_live()
1395 kvm->session = perf_session__new(&file, false, &kvm->tool); in kvm_events_live()
1396 if (kvm->session == NULL) { in kvm_events_live()
1400 kvm->session->evlist = kvm->evlist; in kvm_events_live()
1401 perf_session__set_id_hdr_size(kvm->session); in kvm_events_live()
1402 ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true); in kvm_events_live()
1403 machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target, in kvm_events_live()
1404 kvm->evlist->threads, false, kvm->opts.proc_map_timeout); in kvm_events_live()
1405 err = kvm_live_open_events(kvm); in kvm_events_live()
1409 err = kvm_events_live_report(kvm); in kvm_events_live()
1414 if (kvm->session) in kvm_events_live()
1415 perf_session__delete(kvm->session); in kvm_events_live()
1416 kvm->session = NULL; in kvm_events_live()
1417 if (kvm->evlist) in kvm_events_live()
1418 perf_evlist__delete(kvm->evlist); in kvm_events_live()
1438 struct perf_kvm_stat kvm = { in kvm_cmd_stat() local
1453 return kvm_events_record(&kvm, argc - 1, argv + 1); in kvm_cmd_stat()
1456 return kvm_events_report(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()
1460 return kvm_events_live(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()