Lines Matching refs:kvm

513 static void print_result(struct perf_kvm_stat *kvm);
582 static void kvm_display(struct perf_kvm_stat *kvm) in kvm_display() argument
585 print_result(kvm); in kvm_display()
592 static void kvm_display(struct perf_kvm_stat *kvm) in kvm_display() argument
595 print_result(kvm); in kvm_display()
618 static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) in register_kvm_events_ops() argument
623 if (!strcmp(events_ops->name, kvm->report_event)) { in register_kvm_events_ops()
624 kvm->events_ops = events_ops->ops; in register_kvm_events_ops()
720 static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm, in find_create_kvm_event() argument
736 kvm->events_ops->decode_key(kvm, key, ki->name); in find_create_kvm_event()
738 &kvm->al, NULL, NULL, NULL, ki, sample, true); in find_create_kvm_event()
747 event->perf_kvm = kvm; in find_create_kvm_event()
754 static bool handle_begin_event(struct perf_kvm_stat *kvm, in handle_begin_event() argument
762 event = find_create_kvm_event(kvm, key, sample); in handle_begin_event()
787 static bool update_kvm_event(struct perf_kvm_stat *kvm, in update_kvm_event() argument
792 kvm->total_count++; in update_kvm_event()
793 kvm->total_time += time_diff; in update_kvm_event()
807 static bool is_child_event(struct perf_kvm_stat *kvm, in is_child_event() argument
814 child_ops = kvm->events_ops->child_ops; in is_child_event()
829 static bool handle_child_event(struct perf_kvm_stat *kvm, in handle_child_event() argument
837 event = find_create_kvm_event(kvm, key, sample); in handle_child_event()
855 static bool handle_end_event(struct perf_kvm_stat *kvm, in handle_end_event() argument
864 if (kvm->trace_vcpu == -1) in handle_end_event()
886 event = find_create_kvm_event(kvm, key, sample); in handle_end_event()
902 if (kvm->duration && time_diff > kvm->duration) { in handle_end_event()
905 kvm->events_ops->decode_key(kvm, &event->key, decode); in handle_end_event()
913 return update_kvm_event(kvm, event, vcpu, time_diff); in handle_end_event()
938 static bool handle_kvm_event(struct perf_kvm_stat *kvm, in handle_kvm_event() argument
945 .exit_reasons = kvm->exit_reasons }; in handle_kvm_event()
952 if ((kvm->trace_vcpu != -1) && in handle_kvm_event()
953 (kvm->trace_vcpu != vcpu_record->vcpu_id)) in handle_kvm_event()
956 if (kvm->events_ops->is_begin_event(evsel, sample, &key)) in handle_kvm_event()
957 return handle_begin_event(kvm, vcpu_record, &key, sample); in handle_kvm_event()
959 if (is_child_event(kvm, evsel, sample, &key)) in handle_kvm_event()
960 return handle_child_event(kvm, vcpu_record, &key, sample); in handle_kvm_event()
962 if (kvm->events_ops->is_end_event(evsel, sample, &key)) in handle_kvm_event()
963 return handle_end_event(kvm, vcpu_record, &key, sample); in handle_kvm_event()
968 static bool is_valid_key(struct perf_kvm_stat *kvm) in is_valid_key() argument
976 if (!strcmp(key_array[i], kvm->sort_key)) in is_valid_key()
979 pr_err("Unsupported sort key: %s\n", kvm->sort_key); in is_valid_key()
1002 static void sort_result(struct perf_kvm_stat *kvm) in sort_result() argument
1008 kvm_hists__reinit(output_columns, kvm->sort_key); in sort_result()
1015 static void print_vcpu_info(struct perf_kvm_stat *kvm) in print_vcpu_info() argument
1017 int vcpu = kvm->trace_vcpu; in print_vcpu_info()
1021 if (kvm->opts.target.system_wide) in print_vcpu_info()
1023 else if (kvm->opts.target.pid) in print_vcpu_info()
1024 pr_info("pid(s) %s, ", kvm->opts.target.pid); in print_vcpu_info()
1050 static void print_result(struct perf_kvm_stat *kvm) in print_result() argument
1054 int vcpu = kvm->trace_vcpu; in print_result()
1057 if (kvm->live) { in print_result()
1063 print_vcpu_info(kvm); in print_result()
1064 pr_info("%*s ", KVM_EVENT_NAME_LEN, kvm->events_ops->name); in print_result()
1088 kvm->events_ops->decode_key(kvm, &event->key, decode); in print_result()
1091 pr_info("%8.2f%% ", (double)ecount / kvm->total_count * 100); in print_result()
1092 pr_info("%8.2f%% ", (double)etime / kvm->total_time * 100); in print_result()
1101 kvm->total_count, kvm->total_time / (double)NSEC_PER_USEC); in print_result()
1103 if (kvm->lost_events) in print_result()
1104 pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events); in print_result()
1113 struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, tool); in process_lost_event() local
1115 kvm->lost_events++; in process_lost_event()
1120 static bool skip_sample(struct perf_kvm_stat *kvm, in skip_sample() argument
1123 if (kvm->pid_list && intlist__find(kvm->pid_list, sample->pid) == NULL) in skip_sample()
1137 struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, in process_sample_event() local
1140 if (skip_sample(kvm, sample)) in process_sample_event()
1143 if (machine__resolve(machine, &kvm->al, sample) < 0) { in process_sample_event()
1155 if (!handle_kvm_event(kvm, thread, evsel, sample)) in process_sample_event()
1162 static int cpu_isa_config(struct perf_kvm_stat *kvm) in cpu_isa_config() argument
1167 if (kvm->live) { in cpu_isa_config()
1178 cpuid = perf_session__env(kvm->session)->cpuid; in cpu_isa_config()
1185 err = cpu_isa_init(kvm, cpuid); in cpu_isa_config()
1208 static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx, in perf_kvm__mmap_read_idx() argument
1211 struct evlist *evlist = kvm->evlist; in perf_kvm__mmap_read_idx()
1232 err = perf_session__queue_event(kvm->session, event, timestamp, 0, NULL); in perf_kvm__mmap_read_idx()
1258 static int perf_kvm__mmap_read(struct perf_kvm_stat *kvm) in perf_kvm__mmap_read() argument
1264 for (i = 0; i < kvm->evlist->core.nr_mmaps; i++) { in perf_kvm__mmap_read()
1265 n = perf_kvm__mmap_read_idx(kvm, i, &mmap_time); in perf_kvm__mmap_read()
1286 struct ordered_events *oe = &kvm->session->ordered_events; in perf_kvm__mmap_read()
1291 if (kvm->lost_events) in perf_kvm__mmap_read()
1293 kvm->lost_events); in perf_kvm__mmap_read()
1308 static int perf_kvm__timerfd_create(struct perf_kvm_stat *kvm) in perf_kvm__timerfd_create() argument
1313 kvm->timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); in perf_kvm__timerfd_create()
1314 if (kvm->timerfd < 0) { in perf_kvm__timerfd_create()
1319 new_value.it_value.tv_sec = kvm->display_time; in perf_kvm__timerfd_create()
1321 new_value.it_interval.tv_sec = kvm->display_time; in perf_kvm__timerfd_create()
1324 if (timerfd_settime(kvm->timerfd, 0, &new_value, NULL) != 0) { in perf_kvm__timerfd_create()
1326 close(kvm->timerfd); in perf_kvm__timerfd_create()
1335 static int perf_kvm__handle_timerfd(struct perf_kvm_stat *kvm) in perf_kvm__handle_timerfd() argument
1340 rc = read(kvm->timerfd, &c, sizeof(uint64_t)); in perf_kvm__handle_timerfd()
1358 sort_result(kvm); in perf_kvm__handle_timerfd()
1359 print_result(kvm); in perf_kvm__handle_timerfd()
1366 kvm->total_count = 0; in perf_kvm__handle_timerfd()
1367 kvm->total_time = 0; in perf_kvm__handle_timerfd()
1368 kvm->lost_events = 0; in perf_kvm__handle_timerfd()
1402 static int kvm_events_live_report(struct perf_kvm_stat *kvm) in kvm_events_live_report() argument
1408 kvm->live = true; in kvm_events_live_report()
1410 ret = cpu_isa_config(kvm); in kvm_events_live_report()
1414 if (!verify_vcpu(kvm->trace_vcpu) || in kvm_events_live_report()
1415 !is_valid_key(kvm) || in kvm_events_live_report()
1416 !register_kvm_events_ops(kvm)) { in kvm_events_live_report()
1428 if (perf_kvm__timerfd_create(kvm) < 0) { in kvm_events_live_report()
1433 if (evlist__add_pollfd(kvm->evlist, kvm->timerfd) < 0) in kvm_events_live_report()
1436 nr_stdin = evlist__add_pollfd(kvm->evlist, fileno(stdin)); in kvm_events_live_report()
1444 evlist__enable(kvm->evlist); in kvm_events_live_report()
1447 struct fdarray *fda = &kvm->evlist->core.pollfd; in kvm_events_live_report()
1450 rc = perf_kvm__mmap_read(kvm); in kvm_events_live_report()
1454 err = perf_kvm__handle_timerfd(kvm); in kvm_events_live_report()
1462 err = evlist__poll(kvm->evlist, 100); in kvm_events_live_report()
1465 evlist__disable(kvm->evlist); in kvm_events_live_report()
1468 sort_result(kvm); in kvm_events_live_report()
1469 print_result(kvm); in kvm_events_live_report()
1475 if (kvm->timerfd >= 0) in kvm_events_live_report()
1476 close(kvm->timerfd); in kvm_events_live_report()
1482 static int kvm_live_open_events(struct perf_kvm_stat *kvm) in kvm_live_open_events() argument
1486 struct evlist *evlist = kvm->evlist; in kvm_live_open_events()
1489 evlist__config(evlist, &kvm->opts, NULL); in kvm_live_open_events()
1529 if (evlist__mmap(evlist, kvm->opts.mmap_pages) < 0) { in kvm_live_open_events()
1543 static int read_events(struct perf_kvm_stat *kvm) in read_events() argument
1548 .path = kvm->file_name, in read_events()
1550 .force = kvm->force, in read_events()
1553 perf_tool__init(&kvm->tool, /*ordered_events=*/true); in read_events()
1554 kvm->tool.sample = process_sample_event; in read_events()
1555 kvm->tool.comm = perf_event__process_comm; in read_events()
1556 kvm->tool.namespaces = perf_event__process_namespaces; in read_events()
1558 kvm->session = perf_session__new(&file, &kvm->tool); in read_events()
1559 if (IS_ERR(kvm->session)) { in read_events()
1561 return PTR_ERR(kvm->session); in read_events()
1564 symbol__init(perf_session__env(kvm->session)); in read_events()
1566 if (!perf_session__has_traces(kvm->session, "kvm record")) { in read_events()
1575 ret = cpu_isa_config(kvm); in read_events()
1579 ret = perf_session__process_events(kvm->session); in read_events()
1582 perf_session__delete(kvm->session); in read_events()
1586 static int parse_target_str(struct perf_kvm_stat *kvm) in parse_target_str() argument
1588 if (kvm->opts.target.pid) { in parse_target_str()
1589 kvm->pid_list = intlist__new(kvm->opts.target.pid); in parse_target_str()
1590 if (kvm->pid_list == NULL) { in parse_target_str()
1599 static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm) in kvm_events_report_vcpu() argument
1602 int vcpu = kvm->trace_vcpu; in kvm_events_report_vcpu()
1604 if (parse_target_str(kvm) != 0) in kvm_events_report_vcpu()
1610 if (!is_valid_key(kvm)) in kvm_events_report_vcpu()
1613 if (!register_kvm_events_ops(kvm)) in kvm_events_report_vcpu()
1616 if (kvm->use_stdio) { in kvm_events_report_vcpu()
1627 ret = read_events(kvm); in kvm_events_report_vcpu()
1631 sort_result(kvm); in kvm_events_report_vcpu()
1632 kvm_display(kvm); in kvm_events_report_vcpu()
1647 int __weak setup_kvm_events_tp(struct perf_kvm_stat *kvm __maybe_unused) in setup_kvm_events_tp()
1653 kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv) in kvm_events_record() argument
1671 ret = setup_kvm_events_tp(kvm); in kvm_events_record()
1696 rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name); in kvm_events_record()
1726 kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv) in kvm_events_report() argument
1729 OPT_STRING(0, "event", &kvm->report_event, "report event", in kvm_events_report()
1732 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu, in kvm_events_report()
1734 OPT_STRING('k', "key", &kvm->sort_key, "sort-key", in kvm_events_report()
1737 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid", in kvm_events_report()
1739 OPT_BOOLEAN('f', "force", &kvm->force, "don't complain, do it"), in kvm_events_report()
1740 OPT_BOOLEAN(0, "stdio", &kvm->use_stdio, "use the stdio interface"), in kvm_events_report()
1759 kvm->use_stdio = true; in kvm_events_report()
1762 if (!kvm->opts.target.pid) in kvm_events_report()
1763 kvm->opts.target.system_wide = true; in kvm_events_report()
1765 return kvm_events_report_vcpu(kvm); in kvm_events_report()
1818 static int kvm_events_live(struct perf_kvm_stat *kvm, in kvm_events_live() argument
1825 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid", in kvm_events_live()
1827 OPT_CALLBACK('m', "mmap-pages", &kvm->opts.mmap_pages, "pages", in kvm_events_live()
1831 OPT_BOOLEAN('a', "all-cpus", &kvm->opts.target.system_wide, in kvm_events_live()
1833 OPT_UINTEGER('d', "display", &kvm->display_time, in kvm_events_live()
1835 OPT_STRING(0, "event", &kvm->report_event, "report event", in kvm_events_live()
1838 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu, in kvm_events_live()
1840 OPT_STRING('k', "key", &kvm->sort_key, "sort-key", in kvm_events_live()
1843 OPT_U64(0, "duration", &kvm->duration, in kvm_events_live()
1861 perf_tool__init(&kvm->tool, /*ordered_events=*/true); in kvm_events_live()
1862 kvm->tool.sample = process_sample_event; in kvm_events_live()
1863 kvm->tool.comm = perf_event__process_comm; in kvm_events_live()
1864 kvm->tool.exit = perf_event__process_exit; in kvm_events_live()
1865 kvm->tool.fork = perf_event__process_fork; in kvm_events_live()
1866 kvm->tool.lost = process_lost_event; in kvm_events_live()
1867 kvm->tool.namespaces = perf_event__process_namespaces; in kvm_events_live()
1870 kvm->display_time = 1; in kvm_events_live()
1871 kvm->opts.user_interval = 1; in kvm_events_live()
1872 kvm->opts.mmap_pages = 512; in kvm_events_live()
1873 kvm->opts.target.uses_mmap = false; in kvm_events_live()
1887 kvm->duration *= NSEC_PER_USEC; /* convert usec to nsec */ in kvm_events_live()
1892 err = target__validate(&kvm->opts.target); in kvm_events_live()
1894 target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ); in kvm_events_live()
1898 if (target__none(&kvm->opts.target)) in kvm_events_live()
1899 kvm->opts.target.system_wide = true; in kvm_events_live()
1905 err = setup_kvm_events_tp(kvm); in kvm_events_live()
1911 kvm->evlist = kvm_live_event_list(); in kvm_events_live()
1912 if (kvm->evlist == NULL) { in kvm_events_live()
1917 if (evlist__create_maps(kvm->evlist, &kvm->opts.target) < 0) in kvm_events_live()
1923 kvm->session = perf_session__new(&data, &kvm->tool); in kvm_events_live()
1924 if (IS_ERR(kvm->session)) { in kvm_events_live()
1925 err = PTR_ERR(kvm->session); in kvm_events_live()
1928 kvm->session->evlist = kvm->evlist; in kvm_events_live()
1929 perf_session__set_id_hdr_size(kvm->session); in kvm_events_live()
1930 ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true); in kvm_events_live()
1931 machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target, in kvm_events_live()
1932 kvm->evlist->core.threads, true, false, 1); in kvm_events_live()
1933 err = kvm_live_open_events(kvm); in kvm_events_live()
1937 err = kvm_events_live_report(kvm); in kvm_events_live()
1940 perf_session__delete(kvm->session); in kvm_events_live()
1941 kvm->session = NULL; in kvm_events_live()
1942 evlist__delete(kvm->evlist); in kvm_events_live()
1962 struct perf_kvm_stat kvm = { in kvm_cmd_stat() local
1977 return kvm_events_record(&kvm, argc - 1, argv + 1); in kvm_cmd_stat()
1980 return kvm_events_report(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()
1984 return kvm_events_live(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()