• Home
  • Raw
  • Download

Lines Matching +full:avg +full:- +full:samples

1 // SPDX-License-Identifier: GPL-2.0
15 #include <subcmd/parse-options.h>
16 #include "util/trace-event.h"
22 #include "util/ordered-events.h"
58 #include "util/kvm-stat.h"
64 key->info = 0; in exit_event_get_key()
65 key->key = perf_evsel__intval(evsel, sample, kvm_exit_reason); in exit_event_get_key()
70 return !strcmp(evsel->name, kvm_exit_trace); in kvm_exit_event()
86 return !strcmp(evsel->name, kvm_entry_trace); in kvm_entry_event()
100 while (tbl->reason != NULL) { in get_exit_reason()
101 if (tbl->exit_code == exit_code) in get_exit_reason()
102 return tbl->reason; in get_exit_reason()
107 (unsigned long long)exit_code, kvm->exit_reasons_isa); in get_exit_reason()
115 const char *exit_reason = get_exit_reason(kvm, key->exit_reasons, in exit_event_decode_key()
116 key->key); in exit_event_decode_key()
125 for (events_ops = kvm_reg_events_ops; events_ops->name; events_ops++) { in register_kvm_events_ops()
126 if (!strcmp(events_ops->name, kvm->report_event)) { in register_kvm_events_ops()
127 kvm->events_ops = events_ops->ops; in register_kvm_events_ops()
147 INIT_LIST_HEAD(&kvm->kvm_events_cache[i]); in init_kvm_event_record()
162 event->total.time = 0; in clear_events_cache_stats()
163 init_stats(&event->total.stats); in clear_events_cache_stats()
165 for (j = 0; j < event->max_vcpu; ++j) { in clear_events_cache_stats()
166 event->vcpu[j].time = 0; in clear_events_cache_stats()
167 init_stats(&event->vcpu[j].stats); in clear_events_cache_stats()
176 return key & (EVENTS_CACHE_SIZE - 1); in kvm_events_hash_fn()
181 int old_max_vcpu = event->max_vcpu; in kvm_event_expand()
184 if (vcpu_id < event->max_vcpu) in kvm_event_expand()
187 while (event->max_vcpu <= vcpu_id) in kvm_event_expand()
188 event->max_vcpu += DEFAULT_VCPU_NUM; in kvm_event_expand()
190 prev = event->vcpu; in kvm_event_expand()
191 event->vcpu = realloc(event->vcpu, in kvm_event_expand()
192 event->max_vcpu * sizeof(*event->vcpu)); in kvm_event_expand()
193 if (!event->vcpu) { in kvm_event_expand()
199 memset(event->vcpu + old_max_vcpu, 0, in kvm_event_expand()
200 (event->max_vcpu - old_max_vcpu) * sizeof(*event->vcpu)); in kvm_event_expand()
214 event->key = *key; in kvm_alloc_init_event()
215 init_stats(&event->total.stats); in kvm_alloc_init_event()
225 BUG_ON(key->key == INVALID_KEY); in find_create_kvm_event()
227 head = &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)]; in find_create_kvm_event()
229 if (event->key.key == key->key && event->key.info == key->info) in find_create_kvm_event()
237 list_add(&event->hash_entry, head); in find_create_kvm_event()
247 if (key->key != INVALID_KEY) in handle_begin_event()
250 vcpu_record->last_event = event; in handle_begin_event()
251 vcpu_record->start_time = timestamp; in handle_begin_event()
258 kvm_stats->time += time_diff; in kvm_update_event_stats()
259 update_stats(&kvm_stats->stats, time_diff); in kvm_update_event_stats()
264 struct kvm_event_stats *kvm_stats = &event->total; in kvm_event_rel_stddev()
266 if (vcpu_id != -1) in kvm_event_rel_stddev()
267 kvm_stats = &event->vcpu[vcpu_id]; in kvm_event_rel_stddev()
269 return rel_stddev_stats(stddev_stats(&kvm_stats->stats), in kvm_event_rel_stddev()
270 avg_stats(&kvm_stats->stats)); in kvm_event_rel_stddev()
276 if (vcpu_id == -1) { in update_kvm_event()
277 kvm_update_event_stats(&event->total, time_diff); in update_kvm_event()
284 kvm_update_event_stats(&event->vcpu[vcpu_id], time_diff); in update_kvm_event()
295 child_ops = kvm->events_ops->child_ops; in is_child_event()
300 for (; child_ops->name; child_ops++) { in is_child_event()
301 if (!strcmp(evsel->name, child_ops->name)) { in is_child_event()
302 child_ops->get_key(evsel, sample, key); in is_child_event()
317 if (key->key != INVALID_KEY) in handle_child_event()
320 vcpu_record->last_event = event; in handle_child_event()
345 if (kvm->trace_vcpu == -1) in handle_end_event()
346 vcpu = -1; in handle_end_event()
348 vcpu = vcpu_record->vcpu_id; in handle_end_event()
350 event = vcpu_record->last_event; in handle_end_event()
351 time_begin = vcpu_record->start_time; in handle_end_event()
359 * the actual event is recognized in the 'end event' (e.g. mmio-event). in handle_end_event()
363 if (!event && key->key == INVALID_KEY) in handle_end_event()
372 vcpu_record->last_event = NULL; in handle_end_event()
373 vcpu_record->start_time = 0; in handle_end_event()
376 if (sample->time < time_begin) { in handle_end_event()
381 time_diff = sample->time - time_begin; in handle_end_event()
383 if (kvm->duration && time_diff > kvm->duration) { in handle_end_event()
386 kvm->events_ops->decode_key(kvm, &event->key, decode); in handle_end_event()
389 sample->time, sample->pid, vcpu_record->vcpu_id, in handle_end_event()
412 vcpu_record->vcpu_id = perf_evsel__intval(evsel, sample, in per_vcpu_record()
427 .exit_reasons = kvm->exit_reasons }; in handle_kvm_event()
434 if ((kvm->trace_vcpu != -1) && in handle_kvm_event()
435 (kvm->trace_vcpu != vcpu_record->vcpu_id)) in handle_kvm_event()
438 if (kvm->events_ops->is_begin_event(evsel, sample, &key)) in handle_kvm_event()
439 return handle_begin_event(kvm, vcpu_record, &key, sample->time); in handle_kvm_event()
444 if (kvm->events_ops->is_end_event(evsel, sample, &key)) in handle_kvm_event()
453 if (vcpu == -1) \
454 return event->total.field; \
456 if (vcpu >= event->max_vcpu) \
459 return event->vcpu[vcpu].field; \
491 if (!strcmp(keys[i].name, kvm->sort_key)) { in select_key()
492 kvm->compare = keys[i].key; in select_key()
497 pr_err("Unknown compare key:%s\n", kvm->sort_key); in select_key()
504 struct rb_node **rb = &result->rb_node; in insert_to_result()
513 rb = &(*rb)->rb_left; in insert_to_result()
515 rb = &(*rb)->rb_right; in insert_to_result()
518 rb_link_node(&event->rb, parent, rb); in insert_to_result()
519 rb_insert_color(&event->rb, result); in insert_to_result()
525 int vcpu = kvm->trace_vcpu; in update_total_count()
527 kvm->total_count += get_event_count(event, vcpu); in update_total_count()
528 kvm->total_time += get_event_time(event, vcpu); in update_total_count()
539 int vcpu = kvm->trace_vcpu; in sort_result()
543 list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) { in sort_result()
546 insert_to_result(&kvm->result, event, in sort_result()
547 kvm->compare, vcpu); in sort_result()
567 int vcpu = kvm->trace_vcpu; in print_vcpu_info()
571 if (kvm->opts.target.system_wide) in print_vcpu_info()
573 else if (kvm->opts.target.pid) in print_vcpu_info()
574 pr_info("pid(s) %s, ", kvm->opts.target.pid); in print_vcpu_info()
578 if (vcpu == -1) in print_vcpu_info()
604 int vcpu = kvm->trace_vcpu; in print_result()
606 if (kvm->live) { in print_result()
613 pr_info("%*s ", decode_str_len, kvm->events_ops->name); in print_result()
614 pr_info("%10s ", "Samples"); in print_result()
615 pr_info("%9s ", "Samples%"); in print_result()
620 pr_info("%16s ", "Avg time"); in print_result()
623 while ((event = pop_from_result(&kvm->result))) { in print_result()
631 kvm->events_ops->decode_key(kvm, &event->key, decode); in print_result()
634 pr_info("%8.2f%% ", (double)ecount / kvm->total_count * 100); in print_result()
635 pr_info("%8.2f%% ", (double)etime / kvm->total_time * 100); in print_result()
638 pr_info("%9.2fus ( +-%7.2f%% )", (double)etime / ecount / NSEC_PER_USEC, in print_result()
643 pr_info("\nTotal Samples:%" PRIu64 ", Total events handled time:%.2fus.\n\n", in print_result()
644 kvm->total_count, kvm->total_time / (double)NSEC_PER_USEC); in print_result()
646 if (kvm->lost_events) in print_result()
647 pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events); in print_result()
658 kvm->lost_events++; in process_lost_event()
666 if (kvm->pid_list && intlist__find(kvm->pid_list, sample->pid) == NULL) in skip_sample()
686 thread = machine__findnew_thread(machine, sample->pid, sample->tid); in process_sample_event()
689 event->header.type); in process_sample_event()
690 return -1; in process_sample_event()
694 err = -1; in process_sample_event()
705 if (kvm->live) { in cpu_isa_config()
710 return -err; in cpu_isa_config()
714 cpuid = kvm->session->header.env.cpuid; in cpu_isa_config()
718 return -EINVAL; in cpu_isa_config()
722 if (err == -ENOTSUP) in cpu_isa_config()
730 if (vcpu != -1 && vcpu < 0) { in verify_vcpu()
740 * the processing of samples per mmap smooth.
747 struct perf_evlist *evlist = kvm->evlist; in perf_kvm__mmap_read_idx()
755 md = &evlist->mmap[idx]; in perf_kvm__mmap_read_idx()
758 return (err == -EAGAIN) ? 0 : -1; in perf_kvm__mmap_read_idx()
765 return -1; in perf_kvm__mmap_read_idx()
768 err = perf_session__queue_event(kvm->session, event, timestamp, 0); in perf_kvm__mmap_read_idx()
777 return -1; in perf_kvm__mmap_read_idx()
800 for (i = 0; i < kvm->evlist->nr_mmaps; i++) { in perf_kvm__mmap_read()
803 return -1; in perf_kvm__mmap_read()
806 * mmap times. Essentially, we flush all the samples queued up in perf_kvm__mmap_read()
807 * from the last pass under our minimal start time -- that leaves in perf_kvm__mmap_read()
808 * a very small race for samples to come in with a lower timestamp. in perf_kvm__mmap_read()
822 struct ordered_events *oe = &kvm->session->ordered_events; in perf_kvm__mmap_read()
824 oe->next_flush = flush_time; in perf_kvm__mmap_read()
827 if (kvm->lost_events) in perf_kvm__mmap_read()
829 kvm->lost_events); in perf_kvm__mmap_read()
847 int rc = -1; in perf_kvm__timerfd_create()
849 kvm->timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); in perf_kvm__timerfd_create()
850 if (kvm->timerfd < 0) { in perf_kvm__timerfd_create()
855 new_value.it_value.tv_sec = kvm->display_time; in perf_kvm__timerfd_create()
857 new_value.it_interval.tv_sec = kvm->display_time; in perf_kvm__timerfd_create()
860 if (timerfd_settime(kvm->timerfd, 0, &new_value, NULL) != 0) { in perf_kvm__timerfd_create()
862 close(kvm->timerfd); in perf_kvm__timerfd_create()
876 rc = read(kvm->timerfd, &c, sizeof(uint64_t)); in perf_kvm__handle_timerfd()
882 return -1; in perf_kvm__handle_timerfd()
886 pr_err("Error reading timer fd - invalid size returned\n"); in perf_kvm__handle_timerfd()
887 return -1; in perf_kvm__handle_timerfd()
891 pr_debug("Missed timer beats: %" PRIu64 "\n", c-1); in perf_kvm__handle_timerfd()
898 clear_events_cache_stats(kvm->kvm_events_cache); in perf_kvm__handle_timerfd()
899 kvm->total_count = 0; in perf_kvm__handle_timerfd()
900 kvm->total_time = 0; in perf_kvm__handle_timerfd()
901 kvm->lost_events = 0; in perf_kvm__handle_timerfd()
913 return -1; in fd_set_nonblock()
917 pr_err("Failed to set non-block option on fd %d\n", fd); in fd_set_nonblock()
918 return -1; in fd_set_nonblock()
937 int nr_stdin, ret, err = -EINVAL; in kvm_events_live_report()
941 kvm->live = true; in kvm_events_live_report()
947 if (!verify_vcpu(kvm->trace_vcpu) || in kvm_events_live_report()
961 err = -1; in kvm_events_live_report()
965 if (perf_evlist__add_pollfd(kvm->evlist, kvm->timerfd) < 0) in kvm_events_live_report()
968 nr_stdin = perf_evlist__add_pollfd(kvm->evlist, fileno(stdin)); in kvm_events_live_report()
975 /* everything is good - enable the events and process */ in kvm_events_live_report()
976 perf_evlist__enable(kvm->evlist); in kvm_events_live_report()
979 struct fdarray *fda = &kvm->evlist->pollfd; in kvm_events_live_report()
990 if (fda->entries[nr_stdin].revents & POLLIN) in kvm_events_live_report()
997 perf_evlist__disable(kvm->evlist); in kvm_events_live_report()
1005 if (kvm->timerfd >= 0) in kvm_events_live_report()
1006 close(kvm->timerfd); in kvm_events_live_report()
1014 int err, rc = -1; in kvm_live_open_events()
1016 struct perf_evlist *evlist = kvm->evlist; in kvm_live_open_events()
1019 perf_evlist__config(evlist, &kvm->opts, NULL); in kvm_live_open_events()
1026 struct perf_event_attr *attr = &pos->attr; in kvm_live_open_events()
1039 attr->mmap = 0; in kvm_live_open_events()
1040 attr->comm = 0; in kvm_live_open_events()
1041 attr->task = 0; in kvm_live_open_events()
1043 attr->sample_period = 1; in kvm_live_open_events()
1045 attr->watermark = 0; in kvm_live_open_events()
1046 attr->wakeup_events = 1000; in kvm_live_open_events()
1049 attr->disabled = 1; in kvm_live_open_events()
1059 if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages) < 0) { in kvm_live_open_events()
1085 .path = kvm->file_name, in read_events()
1088 .force = kvm->force, in read_events()
1091 kvm->tool = eops; in read_events()
1092 kvm->session = perf_session__new(&file, false, &kvm->tool); in read_events()
1093 if (!kvm->session) { in read_events()
1095 return -1; in read_events()
1098 symbol__init(&kvm->session->header.env); in read_events()
1100 if (!perf_session__has_traces(kvm->session, "kvm record")) { in read_events()
1101 ret = -EINVAL; in read_events()
1113 ret = perf_session__process_events(kvm->session); in read_events()
1116 perf_session__delete(kvm->session); in read_events()
1122 if (kvm->opts.target.pid) { in parse_target_str()
1123 kvm->pid_list = intlist__new(kvm->opts.target.pid); in parse_target_str()
1124 if (kvm->pid_list == NULL) { in parse_target_str()
1126 return -EINVAL; in parse_target_str()
1135 int ret = -EINVAL; in kvm_events_report_vcpu()
1136 int vcpu = kvm->trace_vcpu; in kvm_events_report_vcpu()
1168 return -ENOMEM; \
1184 "-R", in kvm_events_record()
1185 "-m", "1024", in kvm_events_record()
1186 "-c", "1", in kvm_events_record()
1210 return -ENOMEM; in kvm_events_record()
1216 rec_argv[i++] = "-e"; in kvm_events_record()
1220 rec_argv[i++] = STRDUP_FAIL_EXIT("-o"); in kvm_events_record()
1221 rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name); in kvm_events_record()
1228 set_option_flag(record_options, 'R', "raw-samples", PARSE_OPT_HIDDEN); in kvm_events_record()
1233 set_option_flag(record_options, 0, "call-graph", PARSE_OPT_DISABLED); in kvm_events_record()
1237 set_option_flag(record_options, 'n', "no-samples", PARSE_OPT_DISABLED); in kvm_events_record()
1238 set_option_flag(record_options, 'N', "no-buildid-cache", PARSE_OPT_DISABLED); in kvm_events_record()
1239 set_option_flag(record_options, 'B', "no-buildid", PARSE_OPT_DISABLED); in kvm_events_record()
1241 set_option_flag(record_options, 'b', "branch-any", PARSE_OPT_DISABLED); in kvm_events_record()
1242 set_option_flag(record_options, 'j', "branch-filter", PARSE_OPT_DISABLED); in kvm_events_record()
1254 OPT_STRING(0, "event", &kvm->report_event, "report event", in kvm_events_report()
1257 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu, in kvm_events_report()
1259 OPT_STRING('k', "key", &kvm->sort_key, "sort-key", in kvm_events_report()
1260 "key for sorting: sample(sort by samples number)" in kvm_events_report()
1261 " time (sort by avg time)"), in kvm_events_report()
1262 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid", in kvm_events_report()
1264 OPT_BOOLEAN('f', "force", &kvm->force, "don't complain, do it"), in kvm_events_report()
1282 if (!kvm->opts.target.pid) in kvm_events_report()
1283 kvm->opts.target.system_wide = true; in kvm_events_report()
1293 int err = -1; in kvm_live_event_list()
1345 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid", in kvm_events_live()
1347 OPT_CALLBACK('m', "mmap-pages", &kvm->opts.mmap_pages, "pages", in kvm_events_live()
1352 OPT_BOOLEAN('a', "all-cpus", &kvm->opts.target.system_wide, in kvm_events_live()
1353 "system-wide collection from all CPUs"), in kvm_events_live()
1354 OPT_UINTEGER('d', "display", &kvm->display_time, in kvm_events_live()
1356 OPT_STRING(0, "event", &kvm->report_event, "report event", in kvm_events_live()
1359 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu, in kvm_events_live()
1361 OPT_STRING('k', "key", &kvm->sort_key, "sort-key", in kvm_events_live()
1362 "key for sorting: sample(sort by samples number)" in kvm_events_live()
1363 " time (sort by avg time)"), in kvm_events_live()
1364 OPT_U64(0, "duration", &kvm->duration, in kvm_events_live()
1368 OPT_UINTEGER(0, "proc-map-timeout", &kvm->opts.proc_map_timeout, in kvm_events_live()
1382 kvm->tool.sample = process_sample_event; in kvm_events_live()
1383 kvm->tool.comm = perf_event__process_comm; in kvm_events_live()
1384 kvm->tool.exit = perf_event__process_exit; in kvm_events_live()
1385 kvm->tool.fork = perf_event__process_fork; in kvm_events_live()
1386 kvm->tool.lost = process_lost_event; in kvm_events_live()
1387 kvm->tool.namespaces = perf_event__process_namespaces; in kvm_events_live()
1388 kvm->tool.ordered_events = true; in kvm_events_live()
1389 perf_tool__fill_defaults(&kvm->tool); in kvm_events_live()
1392 kvm->display_time = 1; in kvm_events_live()
1393 kvm->opts.user_interval = 1; in kvm_events_live()
1394 kvm->opts.mmap_pages = 512; in kvm_events_live()
1395 kvm->opts.target.uses_mmap = false; in kvm_events_live()
1396 kvm->opts.target.uid_str = NULL; in kvm_events_live()
1397 kvm->opts.target.uid = UINT_MAX; in kvm_events_live()
1398 kvm->opts.proc_map_timeout = 500; in kvm_events_live()
1412 kvm->duration *= NSEC_PER_USEC; /* convert usec to nsec */ in kvm_events_live()
1417 err = target__validate(&kvm->opts.target); in kvm_events_live()
1419 target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ); in kvm_events_live()
1423 if (target__none(&kvm->opts.target)) in kvm_events_live()
1424 kvm->opts.target.system_wide = true; in kvm_events_live()
1436 kvm->evlist = kvm_live_event_list(); in kvm_events_live()
1437 if (kvm->evlist == NULL) { in kvm_events_live()
1438 err = -1; in kvm_events_live()
1442 if (perf_evlist__create_maps(kvm->evlist, &kvm->opts.target) < 0) in kvm_events_live()
1448 kvm->session = perf_session__new(&data, false, &kvm->tool); in kvm_events_live()
1449 if (kvm->session == NULL) { in kvm_events_live()
1450 err = -1; in kvm_events_live()
1453 kvm->session->evlist = kvm->evlist; in kvm_events_live()
1454 perf_session__set_id_hdr_size(kvm->session); in kvm_events_live()
1455 ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true); in kvm_events_live()
1456 machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target, in kvm_events_live()
1457 kvm->evlist->threads, false, in kvm_events_live()
1458 kvm->opts.proc_map_timeout, 1); in kvm_events_live()
1466 perf_session__delete(kvm->session); in kvm_events_live()
1467 kvm->session = NULL; in kvm_events_live()
1468 perf_evlist__delete(kvm->evlist); in kvm_events_live()
1491 .trace_vcpu = -1, in kvm_cmd_stat()
1503 return kvm_events_record(&kvm, argc - 1, argv + 1); in kvm_cmd_stat()
1506 return kvm_events_report(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()
1510 return kvm_events_live(&kvm, argc - 1 , argv + 1); in kvm_cmd_stat()
1526 rec_argv[i++] = strdup("-o"); in __cmd_record()
1544 rec_argv[i++] = strdup("-i"); in __cmd_report()
1562 rec_argv[i++] = strdup("buildid-list"); in __cmd_buildid_list()
1563 rec_argv[i++] = strdup("-i"); in __cmd_buildid_list()
1600 "buildid-list", "stat", NULL }; in cmd_kvm()
1619 return -ENOMEM; in cmd_kvm()
1631 else if (!strncmp(argv[0], "buildid-list", 12)) in cmd_kvm()