Lines Matching +full:min +full:- +full:sample +full:- +full:time +full:- +full:ns
1 // SPDX-License-Identifier: GPL-2.0
5 #include "util/build-id.h"
16 #include <subcmd/parse-options.h>
17 #include "util/trace-event.h"
21 #include "util/synthetic-events.h"
24 #include "util/ordered-events.h"
25 #include "util/kvm-stat.h"
36 #include <sys/time.h>
59 if (vcpu == -1) \
60 return event->total.field; \
62 if (vcpu >= event->max_vcpu) \
65 return event->vcpu[vcpu].field; \
73 return get_event_ ##func(one, vcpu) - \
77 COMPARE_EVENT_KEY(time, time);
79 COMPARE_EVENT_KEY(min, stats.min);
110 return -strcmp(left->kvm_info->name, right->kvm_info->name); in ev_name_cmp()
120 int width = fmt_width(fmt, hpp, he->hists); in ev_name_entry()
122 return scnprintf(hpp->buf, hpp->size, "%*s", width, he->kvm_info->name); in ev_name_entry()
145 perf_kvm = event_left->perf_kvm; \
147 perf_kvm->trace_vcpu); \
150 EV_METRIC_CMP(time)
153 EV_METRIC_CMP(min)
162 int width = fmt_width(fmt, hpp, he->hists); \
166 perf_kvm = event->perf_kvm; \
167 return scnprintf(hpp->buf, hpp->size, "%*lu", width, \
168 get_event_##metric(event, perf_kvm->trace_vcpu)); \
171 EV_METRIC_ENTRY(time)
174 EV_METRIC_ENTRY(min)
177 .header = "Time (ns)",
178 .name = "time",
186 .name = "sample",
193 .header = "Max Time (ns)",
201 .header = "Min Time (ns)",
212 int width = fmt_width(fmt, hpp, he->hists); in ev_entry_mean()
216 perf_kvm = event->perf_kvm; in ev_entry_mean()
217 return scnprintf(hpp->buf, hpp->size, "%*lu", width, in ev_entry_mean()
218 get_event_mean(event, perf_kvm->trace_vcpu)); in ev_entry_mean()
222 .header = "Mean Time (ns)",
247 perf_kvm = event->perf_kvm; \
249 return percent(get_event_##metric(event, perf_kvm->trace_vcpu), \
250 perf_kvm->total_##metric); \
253 EV_METRIC_PERCENT(time)
260 int width = fmt_width(fmt, hpp, he->hists); in EV_METRIC_PERCENT()
265 return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per)); in EV_METRIC_PERCENT()
278 return per_left - per_right; in ev_cmp_time_precent()
282 .header = "Time%",
293 int width = fmt_width(fmt, hpp, he->hists); in ev_entry_count_precent()
298 return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per)); in ev_entry_count_precent()
311 return per_left - per_right; in ev_cmp_count_precent()
315 .header = "Sample%",
341 return kvm_fmt->dim->width; in fmt_width()
353 dim = kvm_fmt->dim; in fmt_header()
355 return scnprintf(hpp->buf, hpp->size, "%*s", width, dim->header); in fmt_header()
363 return kvm_fmt_a->dim == kvm_fmt_b->dim; in fmt_equal()
379 if (!strcmp(dimensions[i]->name, name)) in get_dimension()
399 kvm_fmt->dim = dim; in get_format()
401 fmt = &kvm_fmt->fmt; in get_format()
402 INIT_LIST_HEAD(&fmt->list); in get_format()
403 INIT_LIST_HEAD(&fmt->sort_list); in get_format()
404 fmt->cmp = dim->cmp; in get_format()
405 fmt->sort = dim->cmp; in get_format()
406 fmt->color = NULL; in get_format()
407 fmt->entry = dim->entry; in get_format()
408 fmt->header = fmt_header; in get_format()
409 fmt->width = fmt_width; in get_format()
410 fmt->collapse = dim->cmp; in get_format()
411 fmt->equal = fmt_equal; in get_format()
412 fmt->free = fmt_free; in get_format()
423 return -EINVAL; in kvm_hists__init_output()
426 perf_hpp_list__column_register(hpp_list, &kvm_fmt->fmt); in kvm_hists__init_output()
436 return -EINVAL; in kvm_hists__init_sort()
439 perf_hpp_list__register_sort_field(hpp_list, &kvm_fmt->fmt); in kvm_hists__init_sort()
461 if (ret == -EINVAL) in kvm_hpp_list__init()
463 else if (ret == -ESRCH) in kvm_hpp_list__init()
518 struct rb_node *nd = rb_first_cached(&hb->hists->entries); in kvm_browser__update_nr_entries()
525 if (!he->filtered) in kvm_browser__update_nr_entries()
529 hb->nr_non_filtered_entries = nr_entries; in kvm_browser__update_nr_entries()
536 browser->nr_non_filtered_entries); in kvm_browser__title()
546 browser->title = kvm_browser__title; in perf_kvm_browser__new()
554 int key = -1; in kvm__hists_browse()
558 return -1; in kvm__hists_browse()
560 /* reset abort key so that it can get Ctrl-C as a key */ in kvm__hists_browse()
567 key = hist_browser__run(browser, "? - help", true, 0); in kvm__hists_browse()
622 for (events_ops = kvm_reg_events_ops; events_ops->name; events_ops++) { in register_kvm_events_ops()
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()
658 event->total.time = 0; in clear_events_cache_stats()
659 init_stats(&event->total.stats); in clear_events_cache_stats()
661 for (i = 0; i < event->max_vcpu; ++i) { in clear_events_cache_stats()
662 event->vcpu[i].time = 0; in clear_events_cache_stats()
663 init_stats(&event->vcpu[i].stats); in clear_events_cache_stats()
671 int old_max_vcpu = event->max_vcpu; in kvm_event_expand()
674 if (vcpu_id < event->max_vcpu) in kvm_event_expand()
677 while (event->max_vcpu <= vcpu_id) in kvm_event_expand()
678 event->max_vcpu += DEFAULT_VCPU_NUM; in kvm_event_expand()
680 prev = event->vcpu; in kvm_event_expand()
681 event->vcpu = realloc(event->vcpu, in kvm_event_expand()
682 event->max_vcpu * sizeof(*event->vcpu)); in kvm_event_expand()
683 if (!event->vcpu) { in kvm_event_expand()
689 memset(event->vcpu + old_max_vcpu, 0, in kvm_event_expand()
690 (event->max_vcpu - old_max_vcpu) * sizeof(*event->vcpu)); in kvm_event_expand()
702 init_stats(&kvm_ev->total.stats); in kvm_he_zalloc()
704 return &kvm_ev->he; in kvm_he_zalloc()
722 struct perf_sample *sample) in find_create_kvm_event() argument
728 BUG_ON(key->key == INVALID_KEY); in find_create_kvm_event()
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()
746 if (!event->perf_kvm) { in find_create_kvm_event()
747 event->perf_kvm = kvm; in find_create_kvm_event()
748 event->key = *key; in find_create_kvm_event()
757 struct perf_sample *sample) in handle_begin_event() argument
761 if (key->key != INVALID_KEY) in handle_begin_event()
762 event = find_create_kvm_event(kvm, key, sample); in handle_begin_event()
764 vcpu_record->last_event = event; in handle_begin_event()
765 vcpu_record->start_time = sample->time; in handle_begin_event()
772 kvm_stats->time += time_diff; in kvm_update_event_stats()
773 update_stats(&kvm_stats->stats, time_diff); in kvm_update_event_stats()
778 struct kvm_event_stats *kvm_stats = &event->total; in kvm_event_rel_stddev()
780 if (vcpu_id != -1) in kvm_event_rel_stddev()
781 kvm_stats = &event->vcpu[vcpu_id]; in kvm_event_rel_stddev()
783 return rel_stddev_stats(stddev_stats(&kvm_stats->stats), in kvm_event_rel_stddev()
784 avg_stats(&kvm_stats->stats)); in kvm_event_rel_stddev()
792 kvm->total_count++; in update_kvm_event()
793 kvm->total_time += time_diff; in update_kvm_event()
795 if (vcpu_id == -1) { in update_kvm_event()
796 kvm_update_event_stats(&event->total, time_diff); in update_kvm_event()
803 kvm_update_event_stats(&event->vcpu[vcpu_id], time_diff); in update_kvm_event()
809 struct perf_sample *sample, in is_child_event() argument
814 child_ops = kvm->events_ops->child_ops; in is_child_event()
819 for (; child_ops->name; child_ops++) { in is_child_event()
820 if (evsel__name_is(evsel, child_ops->name)) { in is_child_event()
821 child_ops->get_key(evsel, sample, key); in is_child_event()
832 struct perf_sample *sample) in handle_child_event() argument
836 if (key->key != INVALID_KEY) in handle_child_event()
837 event = find_create_kvm_event(kvm, key, sample); in handle_child_event()
839 vcpu_record->last_event = event; in handle_child_event()
858 struct perf_sample *sample) in handle_end_event() argument
864 if (kvm->trace_vcpu == -1) in handle_end_event()
865 vcpu = -1; in handle_end_event()
867 vcpu = vcpu_record->vcpu_id; in handle_end_event()
869 event = vcpu_record->last_event; in handle_end_event()
870 time_begin = vcpu_record->start_time; in handle_end_event()
878 * the actual event is recognized in the 'end event' (e.g. mmio-event). in handle_end_event()
882 if (!event && key->key == INVALID_KEY) in handle_end_event()
886 event = find_create_kvm_event(kvm, key, sample); in handle_end_event()
891 vcpu_record->last_event = NULL; in handle_end_event()
892 vcpu_record->start_time = 0; in handle_end_event()
895 if (sample->time < time_begin) { in handle_end_event()
896 pr_debug("End time before begin time; skipping event.\n"); in handle_end_event()
900 time_diff = sample->time - time_begin; 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()
908 sample->time, sample->pid, vcpu_record->vcpu_id, in handle_end_event()
919 struct perf_sample *sample) in per_vcpu_record() argument
931 vcpu_record->vcpu_id = evsel__intval(evsel, sample, vcpu_id_str); in per_vcpu_record()
941 struct perf_sample *sample) in handle_kvm_event() argument
945 .exit_reasons = kvm->exit_reasons }; in handle_kvm_event()
947 vcpu_record = per_vcpu_record(thread, evsel, sample); 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()
971 "ev_name", "sample", "time", "max_t", "min_t", "mean_t", in is_valid_key()
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()
994 perf_kvm = event->perf_kvm; in filter_cb()
995 if (!event_is_valid(event, perf_kvm->trace_vcpu)) in filter_cb()
996 he->filtered = 1; in filter_cb()
998 he->filtered = 0; in filter_cb()
1005 const char *output_columns = "ev_name,sample,percent_sample," in sort_result()
1006 "time,percent_time,max_t,min_t,mean_t"; in sort_result()
1008 kvm_hists__reinit(output_columns, kvm->sort_key); in sort_result()
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()
1028 if (vcpu == -1) in print_vcpu_info()
1054 int vcpu = kvm->trace_vcpu; in print_result()
1057 if (kvm->live) { in print_result()
1064 pr_info("%*s ", KVM_EVENT_NAME_LEN, kvm->events_ops->name); in print_result()
1068 pr_info("%9s ", "Time%"); in print_result()
1069 pr_info("%11s ", "Min Time"); in print_result()
1070 pr_info("%11s ", "Max Time"); in print_result()
1071 pr_info("%16s ", "Avg time"); in print_result()
1076 u64 ecount, etime, max, min; in print_result() local
1079 if (he->filtered) in print_result()
1086 min = get_event_min(event, vcpu); 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()
1093 pr_info("%9.2fus ", (double)min / NSEC_PER_USEC); in print_result()
1095 pr_info("%9.2fus ( +-%7.2f%% )", (double)etime / ecount / NSEC_PER_USEC, in print_result()
1100 pr_info("\nTotal Samples:%" PRIu64 ", Total events handled time:%.2fus.\n\n", 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()
1110 struct perf_sample *sample __maybe_unused, in process_lost_event()
1115 kvm->lost_events++; in process_lost_event()
1121 struct perf_sample *sample) in skip_sample() argument
1123 if (kvm->pid_list && intlist__find(kvm->pid_list, sample->pid) == NULL) in skip_sample()
1131 struct perf_sample *sample, in process_sample_event() argument
1140 if (skip_sample(kvm, sample)) in process_sample_event()
1143 if (machine__resolve(machine, &kvm->al, sample) < 0) { in process_sample_event()
1144 pr_warning("Fail to resolve address location, skip sample.\n"); in process_sample_event()
1148 thread = machine__findnew_thread(machine, sample->pid, sample->tid); in process_sample_event()
1151 event->header.type); in process_sample_event()
1152 return -1; in process_sample_event()
1155 if (!handle_kvm_event(kvm, thread, evsel, sample)) in process_sample_event()
1156 err = -1; in process_sample_event()
1167 if (kvm->live) { in cpu_isa_config()
1168 struct perf_cpu cpu = {-1}; in cpu_isa_config()
1174 return -err; in cpu_isa_config()
1178 cpuid = kvm->session->header.env.cpuid; in cpu_isa_config()
1182 return -EINVAL; in cpu_isa_config()
1186 if (err == -ENOTSUP) in cpu_isa_config()
1194 if (vcpu != -1 && vcpu < 0) { in verify_vcpu()
1211 struct evlist *evlist = kvm->evlist; in perf_kvm__mmap_read_idx()
1219 md = &evlist->mmap[idx]; in perf_kvm__mmap_read_idx()
1220 err = perf_mmap__read_init(&md->core); in perf_kvm__mmap_read_idx()
1222 return (err == -EAGAIN) ? 0 : -1; in perf_kvm__mmap_read_idx()
1224 while ((event = perf_mmap__read_event(&md->core)) != NULL) { in perf_kvm__mmap_read_idx()
1227 perf_mmap__consume(&md->core); in perf_kvm__mmap_read_idx()
1228 pr_err("Failed to parse sample\n"); in perf_kvm__mmap_read_idx()
1229 return -1; in perf_kvm__mmap_read_idx()
1232 err = perf_session__queue_event(kvm->session, event, timestamp, 0, NULL); in perf_kvm__mmap_read_idx()
1237 perf_mmap__consume(&md->core); in perf_kvm__mmap_read_idx()
1240 pr_err("Failed to enqueue sample: %d\n", err); in perf_kvm__mmap_read_idx()
1241 return -1; in perf_kvm__mmap_read_idx()
1244 /* save time stamp of our first sample for this mmap */ in perf_kvm__mmap_read_idx()
1254 perf_mmap__read_done(&md->core); in perf_kvm__mmap_read_idx()
1264 for (i = 0; i < kvm->evlist->core.nr_mmaps; i++) { in perf_kvm__mmap_read()
1267 return -1; in perf_kvm__mmap_read()
1269 /* flush time is going to be the minimum of all the individual in perf_kvm__mmap_read()
1271 * from the last pass under our minimal start time -- that leaves in perf_kvm__mmap_read()
1286 struct ordered_events *oe = &kvm->session->ordered_events; in perf_kvm__mmap_read()
1288 oe->next_flush = flush_time; in perf_kvm__mmap_read()
1291 if (kvm->lost_events) in perf_kvm__mmap_read()
1293 kvm->lost_events); in perf_kvm__mmap_read()
1311 int rc = -1; in perf_kvm__timerfd_create()
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()
1340 rc = read(kvm->timerfd, &c, sizeof(uint64_t)); in perf_kvm__handle_timerfd()
1346 return -1; in perf_kvm__handle_timerfd()
1350 pr_err("Error reading timer fd - invalid size returned\n"); in perf_kvm__handle_timerfd()
1351 return -1; in perf_kvm__handle_timerfd()
1355 pr_debug("Missed timer beats: %" PRIu64 "\n", c-1); 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()
1380 return -1; in fd_set_nonblock()
1384 pr_err("Failed to set non-block option on fd %d\n", fd); in fd_set_nonblock()
1385 return -1; in fd_set_nonblock()
1404 int nr_stdin, ret, err = -EINVAL; in kvm_events_live_report()
1408 kvm->live = true; in kvm_events_live_report()
1414 if (!verify_vcpu(kvm->trace_vcpu) || in kvm_events_live_report()
1429 err = -1; 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()
1443 /* everything is good - enable the events and process */ 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()
1458 if (fda->entries[nr_stdin].revents & POLLIN) 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()
1475 if (kvm->timerfd >= 0) in kvm_events_live_report()
1476 close(kvm->timerfd); in kvm_events_live_report()
1484 int err, rc = -1; in kvm_live_open_events()
1486 struct evlist *evlist = kvm->evlist; in kvm_live_open_events()
1489 evlist__config(evlist, &kvm->opts, NULL); in kvm_live_open_events()
1496 struct perf_event_attr *attr = &pos->core.attr; in kvm_live_open_events()
1500 evsel__set_sample_bit(pos, TIME); in kvm_live_open_events()
1503 /* make sure these are *not*; want as small a sample as possible */ in kvm_live_open_events()
1509 attr->mmap = 0; in kvm_live_open_events()
1510 attr->comm = 0; in kvm_live_open_events()
1511 attr->task = 0; in kvm_live_open_events()
1513 attr->sample_period = 1; in kvm_live_open_events()
1515 attr->watermark = 0; in kvm_live_open_events()
1516 attr->wakeup_events = 1000; in kvm_live_open_events()
1519 attr->disabled = 1; in kvm_live_open_events()
1529 if (evlist__mmap(evlist, kvm->opts.mmap_pages) < 0) { in kvm_live_open_events()
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(&kvm->session->header.env); in read_events()
1566 if (!perf_session__has_traces(kvm->session, "kvm record")) { in read_events()
1567 ret = -EINVAL; in read_events()
1579 ret = perf_session__process_events(kvm->session); in read_events()
1582 perf_session__delete(kvm->session); in read_events()
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()
1592 return -EINVAL; in parse_target_str()
1601 int ret = -EINVAL; in kvm_events_report_vcpu()
1602 int vcpu = kvm->trace_vcpu; in kvm_events_report_vcpu()
1616 if (kvm->use_stdio) { in kvm_events_report_vcpu()
1643 return -ENOMEM; \
1659 "-R", in kvm_events_record()
1660 "-m", "1024", in kvm_events_record()
1661 "-c", "1", in kvm_events_record()
1685 return -ENOMEM; in kvm_events_record()
1691 rec_argv[i++] = "-e"; in kvm_events_record()
1695 rec_argv[i++] = STRDUP_FAIL_EXIT("-o"); in kvm_events_record()
1696 rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name); in kvm_events_record()
1703 set_option_flag(record_options, 'R', "raw-samples", PARSE_OPT_HIDDEN); in kvm_events_record()
1708 set_option_flag(record_options, 0, "call-graph", PARSE_OPT_DISABLED); in kvm_events_record()
1712 set_option_flag(record_options, 'n', "no-samples", PARSE_OPT_DISABLED); in kvm_events_record()
1713 set_option_flag(record_options, 'N', "no-buildid-cache", PARSE_OPT_DISABLED); in kvm_events_record()
1714 set_option_flag(record_options, 'B', "no-buildid", PARSE_OPT_DISABLED); in kvm_events_record()
1716 set_option_flag(record_options, 'b', "branch-any", PARSE_OPT_DISABLED); in kvm_events_record()
1717 set_option_flag(record_options, 'j', "branch-filter", PARSE_OPT_DISABLED); in kvm_events_record()
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()
1735 "key for sorting: sample(sort by samples number)" in kvm_events_report()
1736 " time (sort by avg time)"), 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()
1773 int err = -1; in kvm_live_event_list()
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()
1832 "system-wide collection from all CPUs"), in kvm_events_live()
1833 OPT_UINTEGER('d', "display", &kvm->display_time, in kvm_events_live()
1834 "time in seconds between display updates"), 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()
1841 "key for sorting: sample(sort by samples number)" in kvm_events_live()
1842 " time (sort by avg time)"), in kvm_events_live()
1843 OPT_U64(0, "duration", &kvm->duration, in kvm_events_live()
1847 OPT_UINTEGER(0, "proc-map-timeout", &proc_map_timeout, 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()
1874 kvm->opts.target.uid_str = NULL; in kvm_events_live()
1875 kvm->opts.target.uid = UINT_MAX; in kvm_events_live()
1889 kvm->duration *= NSEC_PER_USEC; /* convert usec to nsec */ in kvm_events_live()
1894 err = target__validate(&kvm->opts.target); in kvm_events_live()
1896 target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ); in kvm_events_live()
1900 if (target__none(&kvm->opts.target)) in kvm_events_live()
1901 kvm->opts.target.system_wide = true; in kvm_events_live()
1913 kvm->evlist = kvm_live_event_list(); in kvm_events_live()
1914 if (kvm->evlist == NULL) { in kvm_events_live()
1915 err = -1; in kvm_events_live()
1919 if (evlist__create_maps(kvm->evlist, &kvm->opts.target) < 0) in kvm_events_live()
1925 kvm->session = perf_session__new(&data, &kvm->tool); in kvm_events_live()
1926 if (IS_ERR(kvm->session)) { in kvm_events_live()
1927 err = PTR_ERR(kvm->session); in kvm_events_live()
1930 kvm->session->evlist = kvm->evlist; in kvm_events_live()
1931 perf_session__set_id_hdr_size(kvm->session); in kvm_events_live()
1932 ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true); in kvm_events_live()
1933 machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target, in kvm_events_live()
1934 kvm->evlist->core.threads, true, false, 1); in kvm_events_live()
1942 perf_session__delete(kvm->session); in kvm_events_live()
1943 kvm->session = NULL; in kvm_events_live()
1944 evlist__delete(kvm->evlist); in kvm_events_live()
1967 .trace_vcpu = -1, in kvm_cmd_stat()
1969 .sort_key = "sample", in kvm_cmd_stat()
1979 return kvm_events_record(&kvm, argc - 1, argv + 1); in kvm_cmd_stat()
1982 return kvm_events_report(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()
1986 return kvm_events_live(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()
2007 return -EINVAL; in __cmd_record()
2012 rec_argv[i++] = strdup("-o"); in __cmd_record()
2030 rec_argv[i++] = strdup("-i"); in __cmd_report()
2048 rec_argv[i++] = strdup("buildid-list"); in __cmd_buildid_list()
2049 rec_argv[i++] = strdup("-i"); in __cmd_buildid_list()
2080 OPT_BOOLEAN(0, "guest-code", &symbol_conf.guest_code, in cmd_kvm()
2088 "buildid-list", "stat", NULL }; in cmd_kvm()
2108 return -ENOMEM; in cmd_kvm()
2120 else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0])) in cmd_kvm()