perf tools: Move timestamp routines from util.h to time-utils.h
[linux-2.6-block.git] / tools / perf / builtin-kvm.c
1 #include "builtin.h"
2 #include "perf.h"
3
4 #include "util/evsel.h"
5 #include "util/evlist.h"
6 #include "util/term.h"
7 #include "util/util.h"
8 #include "util/cache.h"
9 #include "util/symbol.h"
10 #include "util/thread.h"
11 #include "util/header.h"
12 #include "util/session.h"
13 #include "util/intlist.h"
14 #include <subcmd/parse-options.h>
15 #include "util/trace-event.h"
16 #include "util/debug.h"
17 #include "util/tool.h"
18 #include "util/stat.h"
19 #include "util/top.h"
20 #include "util/data.h"
21 #include "util/ordered-events.h"
22
23 #include <sys/prctl.h>
24 #ifdef HAVE_TIMERFD_SUPPORT
25 #include <sys/timerfd.h>
26 #endif
27 #include <sys/time.h>
28
29 #include <linux/kernel.h>
30 #include <linux/time64.h>
31 #include <errno.h>
32 #include <inttypes.h>
33 #include <termios.h>
34 #include <semaphore.h>
35 #include <signal.h>
36 #include <pthread.h>
37 #include <math.h>
38
39 #ifdef HAVE_KVM_STAT_SUPPORT
40 #include "util/kvm-stat.h"
41
42 void exit_event_get_key(struct perf_evsel *evsel,
43                         struct perf_sample *sample,
44                         struct event_key *key)
45 {
46         key->info = 0;
47         key->key = perf_evsel__intval(evsel, sample, kvm_exit_reason);
48 }
49
50 bool kvm_exit_event(struct perf_evsel *evsel)
51 {
52         return !strcmp(evsel->name, kvm_exit_trace);
53 }
54
55 bool exit_event_begin(struct perf_evsel *evsel,
56                       struct perf_sample *sample, struct event_key *key)
57 {
58         if (kvm_exit_event(evsel)) {
59                 exit_event_get_key(evsel, sample, key);
60                 return true;
61         }
62
63         return false;
64 }
65
66 bool kvm_entry_event(struct perf_evsel *evsel)
67 {
68         return !strcmp(evsel->name, kvm_entry_trace);
69 }
70
71 bool exit_event_end(struct perf_evsel *evsel,
72                     struct perf_sample *sample __maybe_unused,
73                     struct event_key *key __maybe_unused)
74 {
75         return kvm_entry_event(evsel);
76 }
77
78 static const char *get_exit_reason(struct perf_kvm_stat *kvm,
79                                    struct exit_reasons_table *tbl,
80                                    u64 exit_code)
81 {
82         while (tbl->reason != NULL) {
83                 if (tbl->exit_code == exit_code)
84                         return tbl->reason;
85                 tbl++;
86         }
87
88         pr_err("unknown kvm exit code:%lld on %s\n",
89                 (unsigned long long)exit_code, kvm->exit_reasons_isa);
90         return "UNKNOWN";
91 }
92
93 void exit_event_decode_key(struct perf_kvm_stat *kvm,
94                            struct event_key *key,
95                            char *decode)
96 {
97         const char *exit_reason = get_exit_reason(kvm, key->exit_reasons,
98                                                   key->key);
99
100         scnprintf(decode, decode_str_len, "%s", exit_reason);
101 }
102
103 static bool register_kvm_events_ops(struct perf_kvm_stat *kvm)
104 {
105         struct kvm_reg_events_ops *events_ops = kvm_reg_events_ops;
106
107         for (events_ops = kvm_reg_events_ops; events_ops->name; events_ops++) {
108                 if (!strcmp(events_ops->name, kvm->report_event)) {
109                         kvm->events_ops = events_ops->ops;
110                         return true;
111                 }
112         }
113
114         return false;
115 }
116
117 struct vcpu_event_record {
118         int vcpu_id;
119         u64 start_time;
120         struct kvm_event *last_event;
121 };
122
123
124 static void init_kvm_event_record(struct perf_kvm_stat *kvm)
125 {
126         unsigned int i;
127
128         for (i = 0; i < EVENTS_CACHE_SIZE; i++)
129                 INIT_LIST_HEAD(&kvm->kvm_events_cache[i]);
130 }
131
132 #ifdef HAVE_TIMERFD_SUPPORT
133 static void clear_events_cache_stats(struct list_head *kvm_events_cache)
134 {
135         struct list_head *head;
136         struct kvm_event *event;
137         unsigned int i;
138         int j;
139
140         for (i = 0; i < EVENTS_CACHE_SIZE; i++) {
141                 head = &kvm_events_cache[i];
142                 list_for_each_entry(event, head, hash_entry) {
143                         /* reset stats for event */
144                         event->total.time = 0;
145                         init_stats(&event->total.stats);
146
147                         for (j = 0; j < event->max_vcpu; ++j) {
148                                 event->vcpu[j].time = 0;
149                                 init_stats(&event->vcpu[j].stats);
150                         }
151                 }
152         }
153 }
154 #endif
155
156 static int kvm_events_hash_fn(u64 key)
157 {
158         return key & (EVENTS_CACHE_SIZE - 1);
159 }
160
161 static bool kvm_event_expand(struct kvm_event *event, int vcpu_id)
162 {
163         int old_max_vcpu = event->max_vcpu;
164         void *prev;
165
166         if (vcpu_id < event->max_vcpu)
167                 return true;
168
169         while (event->max_vcpu <= vcpu_id)
170                 event->max_vcpu += DEFAULT_VCPU_NUM;
171
172         prev = event->vcpu;
173         event->vcpu = realloc(event->vcpu,
174                               event->max_vcpu * sizeof(*event->vcpu));
175         if (!event->vcpu) {
176                 free(prev);
177                 pr_err("Not enough memory\n");
178                 return false;
179         }
180
181         memset(event->vcpu + old_max_vcpu, 0,
182                (event->max_vcpu - old_max_vcpu) * sizeof(*event->vcpu));
183         return true;
184 }
185
186 static struct kvm_event *kvm_alloc_init_event(struct event_key *key)
187 {
188         struct kvm_event *event;
189
190         event = zalloc(sizeof(*event));
191         if (!event) {
192                 pr_err("Not enough memory\n");
193                 return NULL;
194         }
195
196         event->key = *key;
197         init_stats(&event->total.stats);
198         return event;
199 }
200
201 static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm,
202                                                struct event_key *key)
203 {
204         struct kvm_event *event;
205         struct list_head *head;
206
207         BUG_ON(key->key == INVALID_KEY);
208
209         head = &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)];
210         list_for_each_entry(event, head, hash_entry) {
211                 if (event->key.key == key->key && event->key.info == key->info)
212                         return event;
213         }
214
215         event = kvm_alloc_init_event(key);
216         if (!event)
217                 return NULL;
218
219         list_add(&event->hash_entry, head);
220         return event;
221 }
222
223 static bool handle_begin_event(struct perf_kvm_stat *kvm,
224                                struct vcpu_event_record *vcpu_record,
225                                struct event_key *key, u64 timestamp)
226 {
227         struct kvm_event *event = NULL;
228
229         if (key->key != INVALID_KEY)
230                 event = find_create_kvm_event(kvm, key);
231
232         vcpu_record->last_event = event;
233         vcpu_record->start_time = timestamp;
234         return true;
235 }
236
237 static void
238 kvm_update_event_stats(struct kvm_event_stats *kvm_stats, u64 time_diff)
239 {
240         kvm_stats->time += time_diff;
241         update_stats(&kvm_stats->stats, time_diff);
242 }
243
244 static double kvm_event_rel_stddev(int vcpu_id, struct kvm_event *event)
245 {
246         struct kvm_event_stats *kvm_stats = &event->total;
247
248         if (vcpu_id != -1)
249                 kvm_stats = &event->vcpu[vcpu_id];
250
251         return rel_stddev_stats(stddev_stats(&kvm_stats->stats),
252                                 avg_stats(&kvm_stats->stats));
253 }
254
255 static bool update_kvm_event(struct kvm_event *event, int vcpu_id,
256                              u64 time_diff)
257 {
258         if (vcpu_id == -1) {
259                 kvm_update_event_stats(&event->total, time_diff);
260                 return true;
261         }
262
263         if (!kvm_event_expand(event, vcpu_id))
264                 return false;
265
266         kvm_update_event_stats(&event->vcpu[vcpu_id], time_diff);
267         return true;
268 }
269
270 static bool is_child_event(struct perf_kvm_stat *kvm,
271                            struct perf_evsel *evsel,
272                            struct perf_sample *sample,
273                            struct event_key *key)
274 {
275         struct child_event_ops *child_ops;
276
277         child_ops = kvm->events_ops->child_ops;
278
279         if (!child_ops)
280                 return false;
281
282         for (; child_ops->name; child_ops++) {
283                 if (!strcmp(evsel->name, child_ops->name)) {
284                         child_ops->get_key(evsel, sample, key);
285                         return true;
286                 }
287         }
288
289         return false;
290 }
291
292 static bool handle_child_event(struct perf_kvm_stat *kvm,
293                                struct vcpu_event_record *vcpu_record,
294                                struct event_key *key,
295                                struct perf_sample *sample __maybe_unused)
296 {
297         struct kvm_event *event = NULL;
298
299         if (key->key != INVALID_KEY)
300                 event = find_create_kvm_event(kvm, key);
301
302         vcpu_record->last_event = event;
303
304         return true;
305 }
306
307 static bool skip_event(const char *event)
308 {
309         const char * const *skip_events;
310
311         for (skip_events = kvm_skip_events; *skip_events; skip_events++)
312                 if (!strcmp(event, *skip_events))
313                         return true;
314
315         return false;
316 }
317
318 static bool handle_end_event(struct perf_kvm_stat *kvm,
319                              struct vcpu_event_record *vcpu_record,
320                              struct event_key *key,
321                              struct perf_sample *sample)
322 {
323         struct kvm_event *event;
324         u64 time_begin, time_diff;
325         int vcpu;
326
327         if (kvm->trace_vcpu == -1)
328                 vcpu = -1;
329         else
330                 vcpu = vcpu_record->vcpu_id;
331
332         event = vcpu_record->last_event;
333         time_begin = vcpu_record->start_time;
334
335         /* The begin event is not caught. */
336         if (!time_begin)
337                 return true;
338
339         /*
340          * In some case, the 'begin event' only records the start timestamp,
341          * the actual event is recognized in the 'end event' (e.g. mmio-event).
342          */
343
344         /* Both begin and end events did not get the key. */
345         if (!event && key->key == INVALID_KEY)
346                 return true;
347
348         if (!event)
349                 event = find_create_kvm_event(kvm, key);
350
351         if (!event)
352                 return false;
353
354         vcpu_record->last_event = NULL;
355         vcpu_record->start_time = 0;
356
357         /* seems to happen once in a while during live mode */
358         if (sample->time < time_begin) {
359                 pr_debug("End time before begin time; skipping event.\n");
360                 return true;
361         }
362
363         time_diff = sample->time - time_begin;
364
365         if (kvm->duration && time_diff > kvm->duration) {
366                 char decode[decode_str_len];
367
368                 kvm->events_ops->decode_key(kvm, &event->key, decode);
369                 if (!skip_event(decode)) {
370                         pr_info("%" PRIu64 " VM %d, vcpu %d: %s event took %" PRIu64 "usec\n",
371                                  sample->time, sample->pid, vcpu_record->vcpu_id,
372                                  decode, time_diff / NSEC_PER_USEC);
373                 }
374         }
375
376         return update_kvm_event(event, vcpu, time_diff);
377 }
378
379 static
380 struct vcpu_event_record *per_vcpu_record(struct thread *thread,
381                                           struct perf_evsel *evsel,
382                                           struct perf_sample *sample)
383 {
384         /* Only kvm_entry records vcpu id. */
385         if (!thread__priv(thread) && kvm_entry_event(evsel)) {
386                 struct vcpu_event_record *vcpu_record;
387
388                 vcpu_record = zalloc(sizeof(*vcpu_record));
389                 if (!vcpu_record) {
390                         pr_err("%s: Not enough memory\n", __func__);
391                         return NULL;
392                 }
393
394                 vcpu_record->vcpu_id = perf_evsel__intval(evsel, sample,
395                                                           vcpu_id_str);
396                 thread__set_priv(thread, vcpu_record);
397         }
398
399         return thread__priv(thread);
400 }
401
402 static bool handle_kvm_event(struct perf_kvm_stat *kvm,
403                              struct thread *thread,
404                              struct perf_evsel *evsel,
405                              struct perf_sample *sample)
406 {
407         struct vcpu_event_record *vcpu_record;
408         struct event_key key = { .key = INVALID_KEY,
409                                  .exit_reasons = kvm->exit_reasons };
410
411         vcpu_record = per_vcpu_record(thread, evsel, sample);
412         if (!vcpu_record)
413                 return true;
414
415         /* only process events for vcpus user cares about */
416         if ((kvm->trace_vcpu != -1) &&
417             (kvm->trace_vcpu != vcpu_record->vcpu_id))
418                 return true;
419
420         if (kvm->events_ops->is_begin_event(evsel, sample, &key))
421                 return handle_begin_event(kvm, vcpu_record, &key, sample->time);
422
423         if (is_child_event(kvm, evsel, sample, &key))
424                 return handle_child_event(kvm, vcpu_record, &key, sample);
425
426         if (kvm->events_ops->is_end_event(evsel, sample, &key))
427                 return handle_end_event(kvm, vcpu_record, &key, sample);
428
429         return true;
430 }
431
432 #define GET_EVENT_KEY(func, field)                                      \
433 static u64 get_event_ ##func(struct kvm_event *event, int vcpu)         \
434 {                                                                       \
435         if (vcpu == -1)                                                 \
436                 return event->total.field;                              \
437                                                                         \
438         if (vcpu >= event->max_vcpu)                                    \
439                 return 0;                                               \
440                                                                         \
441         return event->vcpu[vcpu].field;                                 \
442 }
443
444 #define COMPARE_EVENT_KEY(func, field)                                  \
445 GET_EVENT_KEY(func, field)                                              \
446 static int compare_kvm_event_ ## func(struct kvm_event *one,            \
447                                         struct kvm_event *two, int vcpu)\
448 {                                                                       \
449         return get_event_ ##func(one, vcpu) >                           \
450                                 get_event_ ##func(two, vcpu);           \
451 }
452
453 GET_EVENT_KEY(time, time);
454 COMPARE_EVENT_KEY(count, stats.n);
455 COMPARE_EVENT_KEY(mean, stats.mean);
456 GET_EVENT_KEY(max, stats.max);
457 GET_EVENT_KEY(min, stats.min);
458
459 #define DEF_SORT_NAME_KEY(name, compare_key)                            \
460         { #name, compare_kvm_event_ ## compare_key }
461
462 static struct kvm_event_key keys[] = {
463         DEF_SORT_NAME_KEY(sample, count),
464         DEF_SORT_NAME_KEY(time, mean),
465         { NULL, NULL }
466 };
467
468 static bool select_key(struct perf_kvm_stat *kvm)
469 {
470         int i;
471
472         for (i = 0; keys[i].name; i++) {
473                 if (!strcmp(keys[i].name, kvm->sort_key)) {
474                         kvm->compare = keys[i].key;
475                         return true;
476                 }
477         }
478
479         pr_err("Unknown compare key:%s\n", kvm->sort_key);
480         return false;
481 }
482
483 static void insert_to_result(struct rb_root *result, struct kvm_event *event,
484                              key_cmp_fun bigger, int vcpu)
485 {
486         struct rb_node **rb = &result->rb_node;
487         struct rb_node *parent = NULL;
488         struct kvm_event *p;
489
490         while (*rb) {
491                 p = container_of(*rb, struct kvm_event, rb);
492                 parent = *rb;
493
494                 if (bigger(event, p, vcpu))
495                         rb = &(*rb)->rb_left;
496                 else
497                         rb = &(*rb)->rb_right;
498         }
499
500         rb_link_node(&event->rb, parent, rb);
501         rb_insert_color(&event->rb, result);
502 }
503
504 static void
505 update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event)
506 {
507         int vcpu = kvm->trace_vcpu;
508
509         kvm->total_count += get_event_count(event, vcpu);
510         kvm->total_time += get_event_time(event, vcpu);
511 }
512
513 static bool event_is_valid(struct kvm_event *event, int vcpu)
514 {
515         return !!get_event_count(event, vcpu);
516 }
517
518 static void sort_result(struct perf_kvm_stat *kvm)
519 {
520         unsigned int i;
521         int vcpu = kvm->trace_vcpu;
522         struct kvm_event *event;
523
524         for (i = 0; i < EVENTS_CACHE_SIZE; i++) {
525                 list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) {
526                         if (event_is_valid(event, vcpu)) {
527                                 update_total_count(kvm, event);
528                                 insert_to_result(&kvm->result, event,
529                                                  kvm->compare, vcpu);
530                         }
531                 }
532         }
533 }
534
535 /* returns left most element of result, and erase it */
536 static struct kvm_event *pop_from_result(struct rb_root *result)
537 {
538         struct rb_node *node = rb_first(result);
539
540         if (!node)
541                 return NULL;
542
543         rb_erase(node, result);
544         return container_of(node, struct kvm_event, rb);
545 }
546
547 static void print_vcpu_info(struct perf_kvm_stat *kvm)
548 {
549         int vcpu = kvm->trace_vcpu;
550
551         pr_info("Analyze events for ");
552
553         if (kvm->opts.target.system_wide)
554                 pr_info("all VMs, ");
555         else if (kvm->opts.target.pid)
556                 pr_info("pid(s) %s, ", kvm->opts.target.pid);
557         else
558                 pr_info("dazed and confused on what is monitored, ");
559
560         if (vcpu == -1)
561                 pr_info("all VCPUs:\n\n");
562         else
563                 pr_info("VCPU %d:\n\n", vcpu);
564 }
565
566 static void show_timeofday(void)
567 {
568         char date[64];
569         struct timeval tv;
570         struct tm ltime;
571
572         gettimeofday(&tv, NULL);
573         if (localtime_r(&tv.tv_sec, &ltime)) {
574                 strftime(date, sizeof(date), "%H:%M:%S", &ltime);
575                 pr_info("%s.%06ld", date, tv.tv_usec);
576         } else
577                 pr_info("00:00:00.000000");
578
579         return;
580 }
581
582 static void print_result(struct perf_kvm_stat *kvm)
583 {
584         char decode[decode_str_len];
585         struct kvm_event *event;
586         int vcpu = kvm->trace_vcpu;
587
588         if (kvm->live) {
589                 puts(CONSOLE_CLEAR);
590                 show_timeofday();
591         }
592
593         pr_info("\n\n");
594         print_vcpu_info(kvm);
595         pr_info("%*s ", decode_str_len, kvm->events_ops->name);
596         pr_info("%10s ", "Samples");
597         pr_info("%9s ", "Samples%");
598
599         pr_info("%9s ", "Time%");
600         pr_info("%11s ", "Min Time");
601         pr_info("%11s ", "Max Time");
602         pr_info("%16s ", "Avg time");
603         pr_info("\n\n");
604
605         while ((event = pop_from_result(&kvm->result))) {
606                 u64 ecount, etime, max, min;
607
608                 ecount = get_event_count(event, vcpu);
609                 etime = get_event_time(event, vcpu);
610                 max = get_event_max(event, vcpu);
611                 min = get_event_min(event, vcpu);
612
613                 kvm->events_ops->decode_key(kvm, &event->key, decode);
614                 pr_info("%*s ", decode_str_len, decode);
615                 pr_info("%10llu ", (unsigned long long)ecount);
616                 pr_info("%8.2f%% ", (double)ecount / kvm->total_count * 100);
617                 pr_info("%8.2f%% ", (double)etime / kvm->total_time * 100);
618                 pr_info("%9.2fus ", (double)min / NSEC_PER_USEC);
619                 pr_info("%9.2fus ", (double)max / NSEC_PER_USEC);
620                 pr_info("%9.2fus ( +-%7.2f%% )", (double)etime / ecount / NSEC_PER_USEC,
621                         kvm_event_rel_stddev(vcpu, event));
622                 pr_info("\n");
623         }
624
625         pr_info("\nTotal Samples:%" PRIu64 ", Total events handled time:%.2fus.\n\n",
626                 kvm->total_count, kvm->total_time / (double)NSEC_PER_USEC);
627
628         if (kvm->lost_events)
629                 pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
630 }
631
632 #ifdef HAVE_TIMERFD_SUPPORT
633 static int process_lost_event(struct perf_tool *tool,
634                               union perf_event *event __maybe_unused,
635                               struct perf_sample *sample __maybe_unused,
636                               struct machine *machine __maybe_unused)
637 {
638         struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, tool);
639
640         kvm->lost_events++;
641         return 0;
642 }
643 #endif
644
645 static bool skip_sample(struct perf_kvm_stat *kvm,
646                         struct perf_sample *sample)
647 {
648         if (kvm->pid_list && intlist__find(kvm->pid_list, sample->pid) == NULL)
649                 return true;
650
651         return false;
652 }
653
654 static int process_sample_event(struct perf_tool *tool,
655                                 union perf_event *event,
656                                 struct perf_sample *sample,
657                                 struct perf_evsel *evsel,
658                                 struct machine *machine)
659 {
660         int err = 0;
661         struct thread *thread;
662         struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat,
663                                                  tool);
664
665         if (skip_sample(kvm, sample))
666                 return 0;
667
668         thread = machine__findnew_thread(machine, sample->pid, sample->tid);
669         if (thread == NULL) {
670                 pr_debug("problem processing %d event, skipping it.\n",
671                         event->header.type);
672                 return -1;
673         }
674
675         if (!handle_kvm_event(kvm, thread, evsel, sample))
676                 err = -1;
677
678         thread__put(thread);
679         return err;
680 }
681
682 static int cpu_isa_config(struct perf_kvm_stat *kvm)
683 {
684         char buf[64], *cpuid;
685         int err;
686
687         if (kvm->live) {
688                 err = get_cpuid(buf, sizeof(buf));
689                 if (err != 0) {
690                         pr_err("Failed to look up CPU type\n");
691                         return err;
692                 }
693                 cpuid = buf;
694         } else
695                 cpuid = kvm->session->header.env.cpuid;
696
697         if (!cpuid) {
698                 pr_err("Failed to look up CPU type\n");
699                 return -EINVAL;
700         }
701
702         err = cpu_isa_init(kvm, cpuid);
703         if (err == -ENOTSUP)
704                 pr_err("CPU %s is not supported.\n", cpuid);
705
706         return err;
707 }
708
709 static bool verify_vcpu(int vcpu)
710 {
711         if (vcpu != -1 && vcpu < 0) {
712                 pr_err("Invalid vcpu:%d.\n", vcpu);
713                 return false;
714         }
715
716         return true;
717 }
718
719 #ifdef HAVE_TIMERFD_SUPPORT
720 /* keeping the max events to a modest level to keep
721  * the processing of samples per mmap smooth.
722  */
723 #define PERF_KVM__MAX_EVENTS_PER_MMAP  25
724
725 static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
726                                    u64 *mmap_time)
727 {
728         union perf_event *event;
729         struct perf_sample sample;
730         s64 n = 0;
731         int err;
732
733         *mmap_time = ULLONG_MAX;
734         while ((event = perf_evlist__mmap_read(kvm->evlist, idx)) != NULL) {
735                 err = perf_evlist__parse_sample(kvm->evlist, event, &sample);
736                 if (err) {
737                         perf_evlist__mmap_consume(kvm->evlist, idx);
738                         pr_err("Failed to parse sample\n");
739                         return -1;
740                 }
741
742                 err = perf_session__queue_event(kvm->session, event, &sample, 0);
743                 /*
744                  * FIXME: Here we can't consume the event, as perf_session__queue_event will
745                  *        point to it, and it'll get possibly overwritten by the kernel.
746                  */
747                 perf_evlist__mmap_consume(kvm->evlist, idx);
748
749                 if (err) {
750                         pr_err("Failed to enqueue sample: %d\n", err);
751                         return -1;
752                 }
753
754                 /* save time stamp of our first sample for this mmap */
755                 if (n == 0)
756                         *mmap_time = sample.time;
757
758                 /* limit events per mmap handled all at once */
759                 n++;
760                 if (n == PERF_KVM__MAX_EVENTS_PER_MMAP)
761                         break;
762         }
763
764         return n;
765 }
766
767 static int perf_kvm__mmap_read(struct perf_kvm_stat *kvm)
768 {
769         int i, err, throttled = 0;
770         s64 n, ntotal = 0;
771         u64 flush_time = ULLONG_MAX, mmap_time;
772
773         for (i = 0; i < kvm->evlist->nr_mmaps; i++) {
774                 n = perf_kvm__mmap_read_idx(kvm, i, &mmap_time);
775                 if (n < 0)
776                         return -1;
777
778                 /* flush time is going to be the minimum of all the individual
779                  * mmap times. Essentially, we flush all the samples queued up
780                  * from the last pass under our minimal start time -- that leaves
781                  * a very small race for samples to come in with a lower timestamp.
782                  * The ioctl to return the perf_clock timestamp should close the
783                  * race entirely.
784                  */
785                 if (mmap_time < flush_time)
786                         flush_time = mmap_time;
787
788                 ntotal += n;
789                 if (n == PERF_KVM__MAX_EVENTS_PER_MMAP)
790                         throttled = 1;
791         }
792
793         /* flush queue after each round in which we processed events */
794         if (ntotal) {
795                 struct ordered_events *oe = &kvm->session->ordered_events;
796
797                 oe->next_flush = flush_time;
798                 err = ordered_events__flush(oe, OE_FLUSH__ROUND);
799                 if (err) {
800                         if (kvm->lost_events)
801                                 pr_info("\nLost events: %" PRIu64 "\n\n",
802                                         kvm->lost_events);
803                         return err;
804                 }
805         }
806
807         return throttled;
808 }
809
810 static volatile int done;
811
812 static void sig_handler(int sig __maybe_unused)
813 {
814         done = 1;
815 }
816
817 static int perf_kvm__timerfd_create(struct perf_kvm_stat *kvm)
818 {
819         struct itimerspec new_value;
820         int rc = -1;
821
822         kvm->timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
823         if (kvm->timerfd < 0) {
824                 pr_err("timerfd_create failed\n");
825                 goto out;
826         }
827
828         new_value.it_value.tv_sec = kvm->display_time;
829         new_value.it_value.tv_nsec = 0;
830         new_value.it_interval.tv_sec = kvm->display_time;
831         new_value.it_interval.tv_nsec = 0;
832
833         if (timerfd_settime(kvm->timerfd, 0, &new_value, NULL) != 0) {
834                 pr_err("timerfd_settime failed: %d\n", errno);
835                 close(kvm->timerfd);
836                 goto out;
837         }
838
839         rc = 0;
840 out:
841         return rc;
842 }
843
844 static int perf_kvm__handle_timerfd(struct perf_kvm_stat *kvm)
845 {
846         uint64_t c;
847         int rc;
848
849         rc = read(kvm->timerfd, &c, sizeof(uint64_t));
850         if (rc < 0) {
851                 if (errno == EAGAIN)
852                         return 0;
853
854                 pr_err("Failed to read timer fd: %d\n", errno);
855                 return -1;
856         }
857
858         if (rc != sizeof(uint64_t)) {
859                 pr_err("Error reading timer fd - invalid size returned\n");
860                 return -1;
861         }
862
863         if (c != 1)
864                 pr_debug("Missed timer beats: %" PRIu64 "\n", c-1);
865
866         /* update display */
867         sort_result(kvm);
868         print_result(kvm);
869
870         /* reset counts */
871         clear_events_cache_stats(kvm->kvm_events_cache);
872         kvm->total_count = 0;
873         kvm->total_time = 0;
874         kvm->lost_events = 0;
875
876         return 0;
877 }
878
879 static int fd_set_nonblock(int fd)
880 {
881         long arg = 0;
882
883         arg = fcntl(fd, F_GETFL);
884         if (arg < 0) {
885                 pr_err("Failed to get current flags for fd %d\n", fd);
886                 return -1;
887         }
888
889         if (fcntl(fd, F_SETFL, arg | O_NONBLOCK) < 0) {
890                 pr_err("Failed to set non-block option on fd %d\n", fd);
891                 return -1;
892         }
893
894         return 0;
895 }
896
897 static int perf_kvm__handle_stdin(void)
898 {
899         int c;
900
901         c = getc(stdin);
902         if (c == 'q')
903                 return 1;
904
905         return 0;
906 }
907
908 static int kvm_events_live_report(struct perf_kvm_stat *kvm)
909 {
910         int nr_stdin, ret, err = -EINVAL;
911         struct termios save;
912
913         /* live flag must be set first */
914         kvm->live = true;
915
916         ret = cpu_isa_config(kvm);
917         if (ret < 0)
918                 return ret;
919
920         if (!verify_vcpu(kvm->trace_vcpu) ||
921             !select_key(kvm) ||
922             !register_kvm_events_ops(kvm)) {
923                 goto out;
924         }
925
926         set_term_quiet_input(&save);
927         init_kvm_event_record(kvm);
928
929         signal(SIGINT, sig_handler);
930         signal(SIGTERM, sig_handler);
931
932         /* add timer fd */
933         if (perf_kvm__timerfd_create(kvm) < 0) {
934                 err = -1;
935                 goto out;
936         }
937
938         if (perf_evlist__add_pollfd(kvm->evlist, kvm->timerfd) < 0)
939                 goto out;
940
941         nr_stdin = perf_evlist__add_pollfd(kvm->evlist, fileno(stdin));
942         if (nr_stdin < 0)
943                 goto out;
944
945         if (fd_set_nonblock(fileno(stdin)) != 0)
946                 goto out;
947
948         /* everything is good - enable the events and process */
949         perf_evlist__enable(kvm->evlist);
950
951         while (!done) {
952                 struct fdarray *fda = &kvm->evlist->pollfd;
953                 int rc;
954
955                 rc = perf_kvm__mmap_read(kvm);
956                 if (rc < 0)
957                         break;
958
959                 err = perf_kvm__handle_timerfd(kvm);
960                 if (err)
961                         goto out;
962
963                 if (fda->entries[nr_stdin].revents & POLLIN)
964                         done = perf_kvm__handle_stdin();
965
966                 if (!rc && !done)
967                         err = fdarray__poll(fda, 100);
968         }
969
970         perf_evlist__disable(kvm->evlist);
971
972         if (err == 0) {
973                 sort_result(kvm);
974                 print_result(kvm);
975         }
976
977 out:
978         if (kvm->timerfd >= 0)
979                 close(kvm->timerfd);
980
981         tcsetattr(0, TCSAFLUSH, &save);
982         return err;
983 }
984
985 static int kvm_live_open_events(struct perf_kvm_stat *kvm)
986 {
987         int err, rc = -1;
988         struct perf_evsel *pos;
989         struct perf_evlist *evlist = kvm->evlist;
990         char sbuf[STRERR_BUFSIZE];
991
992         perf_evlist__config(evlist, &kvm->opts, NULL);
993
994         /*
995          * Note: exclude_{guest,host} do not apply here.
996          *       This command processes KVM tracepoints from host only
997          */
998         evlist__for_each_entry(evlist, pos) {
999                 struct perf_event_attr *attr = &pos->attr;
1000
1001                 /* make sure these *are* set */
1002                 perf_evsel__set_sample_bit(pos, TID);
1003                 perf_evsel__set_sample_bit(pos, TIME);
1004                 perf_evsel__set_sample_bit(pos, CPU);
1005                 perf_evsel__set_sample_bit(pos, RAW);
1006                 /* make sure these are *not*; want as small a sample as possible */
1007                 perf_evsel__reset_sample_bit(pos, PERIOD);
1008                 perf_evsel__reset_sample_bit(pos, IP);
1009                 perf_evsel__reset_sample_bit(pos, CALLCHAIN);
1010                 perf_evsel__reset_sample_bit(pos, ADDR);
1011                 perf_evsel__reset_sample_bit(pos, READ);
1012                 attr->mmap = 0;
1013                 attr->comm = 0;
1014                 attr->task = 0;
1015
1016                 attr->sample_period = 1;
1017
1018                 attr->watermark = 0;
1019                 attr->wakeup_events = 1000;
1020
1021                 /* will enable all once we are ready */
1022                 attr->disabled = 1;
1023         }
1024
1025         err = perf_evlist__open(evlist);
1026         if (err < 0) {
1027                 printf("Couldn't create the events: %s\n",
1028                        str_error_r(errno, sbuf, sizeof(sbuf)));
1029                 goto out;
1030         }
1031
1032         if (perf_evlist__mmap(evlist, kvm->opts.mmap_pages, false) < 0) {
1033                 ui__error("Failed to mmap the events: %s\n",
1034                           str_error_r(errno, sbuf, sizeof(sbuf)));
1035                 perf_evlist__close(evlist);
1036                 goto out;
1037         }
1038
1039         rc = 0;
1040
1041 out:
1042         return rc;
1043 }
1044 #endif
1045
1046 static int read_events(struct perf_kvm_stat *kvm)
1047 {
1048         int ret;
1049
1050         struct perf_tool eops = {
1051                 .sample                 = process_sample_event,
1052                 .comm                   = perf_event__process_comm,
1053                 .namespaces             = perf_event__process_namespaces,
1054                 .ordered_events         = true,
1055         };
1056         struct perf_data_file file = {
1057                 .path = kvm->file_name,
1058                 .mode = PERF_DATA_MODE_READ,
1059                 .force = kvm->force,
1060         };
1061
1062         kvm->tool = eops;
1063         kvm->session = perf_session__new(&file, false, &kvm->tool);
1064         if (!kvm->session) {
1065                 pr_err("Initializing perf session failed\n");
1066                 return -1;
1067         }
1068
1069         symbol__init(&kvm->session->header.env);
1070
1071         if (!perf_session__has_traces(kvm->session, "kvm record")) {
1072                 ret = -EINVAL;
1073                 goto out_delete;
1074         }
1075
1076         /*
1077          * Do not use 'isa' recorded in kvm_exit tracepoint since it is not
1078          * traced in the old kernel.
1079          */
1080         ret = cpu_isa_config(kvm);
1081         if (ret < 0)
1082                 goto out_delete;
1083
1084         ret = perf_session__process_events(kvm->session);
1085
1086 out_delete:
1087         perf_session__delete(kvm->session);
1088         return ret;
1089 }
1090
1091 static int parse_target_str(struct perf_kvm_stat *kvm)
1092 {
1093         if (kvm->opts.target.pid) {
1094                 kvm->pid_list = intlist__new(kvm->opts.target.pid);
1095                 if (kvm->pid_list == NULL) {
1096                         pr_err("Error parsing process id string\n");
1097                         return -EINVAL;
1098                 }
1099         }
1100
1101         return 0;
1102 }
1103
1104 static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm)
1105 {
1106         int ret = -EINVAL;
1107         int vcpu = kvm->trace_vcpu;
1108
1109         if (parse_target_str(kvm) != 0)
1110                 goto exit;
1111
1112         if (!verify_vcpu(vcpu))
1113                 goto exit;
1114
1115         if (!select_key(kvm))
1116                 goto exit;
1117
1118         if (!register_kvm_events_ops(kvm))
1119                 goto exit;
1120
1121         init_kvm_event_record(kvm);
1122         setup_pager();
1123
1124         ret = read_events(kvm);
1125         if (ret)
1126                 goto exit;
1127
1128         sort_result(kvm);
1129         print_result(kvm);
1130
1131 exit:
1132         return ret;
1133 }
1134
1135 #define STRDUP_FAIL_EXIT(s)             \
1136         ({      char *_p;               \
1137         _p = strdup(s);         \
1138                 if (!_p)                \
1139                         return -ENOMEM; \
1140                 _p;                     \
1141         })
1142
1143 int __weak setup_kvm_events_tp(struct perf_kvm_stat *kvm __maybe_unused)
1144 {
1145         return 0;
1146 }
1147
1148 static int
1149 kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv)
1150 {
1151         unsigned int rec_argc, i, j, events_tp_size;
1152         const char **rec_argv;
1153         const char * const record_args[] = {
1154                 "record",
1155                 "-R",
1156                 "-m", "1024",
1157                 "-c", "1",
1158         };
1159         const char * const kvm_stat_record_usage[] = {
1160                 "perf kvm stat record [<options>]",
1161                 NULL
1162         };
1163         const char * const *events_tp;
1164         int ret;
1165
1166         events_tp_size = 0;
1167         ret = setup_kvm_events_tp(kvm);
1168         if (ret < 0) {
1169                 pr_err("Unable to setup the kvm tracepoints\n");
1170                 return ret;
1171         }
1172
1173         for (events_tp = kvm_events_tp; *events_tp; events_tp++)
1174                 events_tp_size++;
1175
1176         rec_argc = ARRAY_SIZE(record_args) + argc + 2 +
1177                    2 * events_tp_size;
1178         rec_argv = calloc(rec_argc + 1, sizeof(char *));
1179
1180         if (rec_argv == NULL)
1181                 return -ENOMEM;
1182
1183         for (i = 0; i < ARRAY_SIZE(record_args); i++)
1184                 rec_argv[i] = STRDUP_FAIL_EXIT(record_args[i]);
1185
1186         for (j = 0; j < events_tp_size; j++) {
1187                 rec_argv[i++] = "-e";
1188                 rec_argv[i++] = STRDUP_FAIL_EXIT(kvm_events_tp[j]);
1189         }
1190
1191         rec_argv[i++] = STRDUP_FAIL_EXIT("-o");
1192         rec_argv[i++] = STRDUP_FAIL_EXIT(kvm->file_name);
1193
1194         for (j = 1; j < (unsigned int)argc; j++, i++)
1195                 rec_argv[i] = argv[j];
1196
1197         set_option_flag(record_options, 'e', "event", PARSE_OPT_HIDDEN);
1198         set_option_flag(record_options, 0, "filter", PARSE_OPT_HIDDEN);
1199         set_option_flag(record_options, 'R', "raw-samples", PARSE_OPT_HIDDEN);
1200
1201         set_option_flag(record_options, 'F', "freq", PARSE_OPT_DISABLED);
1202         set_option_flag(record_options, 0, "group", PARSE_OPT_DISABLED);
1203         set_option_flag(record_options, 'g', NULL, PARSE_OPT_DISABLED);
1204         set_option_flag(record_options, 0, "call-graph", PARSE_OPT_DISABLED);
1205         set_option_flag(record_options, 'd', "data", PARSE_OPT_DISABLED);
1206         set_option_flag(record_options, 'T', "timestamp", PARSE_OPT_DISABLED);
1207         set_option_flag(record_options, 'P', "period", PARSE_OPT_DISABLED);
1208         set_option_flag(record_options, 'n', "no-samples", PARSE_OPT_DISABLED);
1209         set_option_flag(record_options, 'N', "no-buildid-cache", PARSE_OPT_DISABLED);
1210         set_option_flag(record_options, 'B', "no-buildid", PARSE_OPT_DISABLED);
1211         set_option_flag(record_options, 'G', "cgroup", PARSE_OPT_DISABLED);
1212         set_option_flag(record_options, 'b', "branch-any", PARSE_OPT_DISABLED);
1213         set_option_flag(record_options, 'j', "branch-filter", PARSE_OPT_DISABLED);
1214         set_option_flag(record_options, 'W', "weight", PARSE_OPT_DISABLED);
1215         set_option_flag(record_options, 0, "transaction", PARSE_OPT_DISABLED);
1216
1217         record_usage = kvm_stat_record_usage;
1218         return cmd_record(i, rec_argv);
1219 }
1220
1221 static int
1222 kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
1223 {
1224         const struct option kvm_events_report_options[] = {
1225                 OPT_STRING(0, "event", &kvm->report_event, "report event",
1226                            "event for reporting: vmexit, "
1227                            "mmio (x86 only), ioport (x86 only)"),
1228                 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu,
1229                             "vcpu id to report"),
1230                 OPT_STRING('k', "key", &kvm->sort_key, "sort-key",
1231                             "key for sorting: sample(sort by samples number)"
1232                             " time (sort by avg time)"),
1233                 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid",
1234                            "analyze events only for given process id(s)"),
1235                 OPT_BOOLEAN('f', "force", &kvm->force, "don't complain, do it"),
1236                 OPT_END()
1237         };
1238
1239         const char * const kvm_events_report_usage[] = {
1240                 "perf kvm stat report [<options>]",
1241                 NULL
1242         };
1243
1244         if (argc) {
1245                 argc = parse_options(argc, argv,
1246                                      kvm_events_report_options,
1247                                      kvm_events_report_usage, 0);
1248                 if (argc)
1249                         usage_with_options(kvm_events_report_usage,
1250                                            kvm_events_report_options);
1251         }
1252
1253         if (!kvm->opts.target.pid)
1254                 kvm->opts.target.system_wide = true;
1255
1256         return kvm_events_report_vcpu(kvm);
1257 }
1258
1259 #ifdef HAVE_TIMERFD_SUPPORT
1260 static struct perf_evlist *kvm_live_event_list(void)
1261 {
1262         struct perf_evlist *evlist;
1263         char *tp, *name, *sys;
1264         int err = -1;
1265         const char * const *events_tp;
1266
1267         evlist = perf_evlist__new();
1268         if (evlist == NULL)
1269                 return NULL;
1270
1271         for (events_tp = kvm_events_tp; *events_tp; events_tp++) {
1272
1273                 tp = strdup(*events_tp);
1274                 if (tp == NULL)
1275                         goto out;
1276
1277                 /* split tracepoint into subsystem and name */
1278                 sys = tp;
1279                 name = strchr(tp, ':');
1280                 if (name == NULL) {
1281                         pr_err("Error parsing %s tracepoint: subsystem delimiter not found\n",
1282                                *events_tp);
1283                         free(tp);
1284                         goto out;
1285                 }
1286                 *name = '\0';
1287                 name++;
1288
1289                 if (perf_evlist__add_newtp(evlist, sys, name, NULL)) {
1290                         pr_err("Failed to add %s tracepoint to the list\n", *events_tp);
1291                         free(tp);
1292                         goto out;
1293                 }
1294
1295                 free(tp);
1296         }
1297
1298         err = 0;
1299
1300 out:
1301         if (err) {
1302                 perf_evlist__delete(evlist);
1303                 evlist = NULL;
1304         }
1305
1306         return evlist;
1307 }
1308
1309 static int kvm_events_live(struct perf_kvm_stat *kvm,
1310                            int argc, const char **argv)
1311 {
1312         char errbuf[BUFSIZ];
1313         int err;
1314
1315         const struct option live_options[] = {
1316                 OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid",
1317                         "record events on existing process id"),
1318                 OPT_CALLBACK('m', "mmap-pages", &kvm->opts.mmap_pages, "pages",
1319                         "number of mmap data pages",
1320                         perf_evlist__parse_mmap_pages),
1321                 OPT_INCR('v', "verbose", &verbose,
1322                         "be more verbose (show counter open errors, etc)"),
1323                 OPT_BOOLEAN('a', "all-cpus", &kvm->opts.target.system_wide,
1324                         "system-wide collection from all CPUs"),
1325                 OPT_UINTEGER('d', "display", &kvm->display_time,
1326                         "time in seconds between display updates"),
1327                 OPT_STRING(0, "event", &kvm->report_event, "report event",
1328                         "event for reporting: "
1329                         "vmexit, mmio (x86 only), ioport (x86 only)"),
1330                 OPT_INTEGER(0, "vcpu", &kvm->trace_vcpu,
1331                         "vcpu id to report"),
1332                 OPT_STRING('k', "key", &kvm->sort_key, "sort-key",
1333                         "key for sorting: sample(sort by samples number)"
1334                         " time (sort by avg time)"),
1335                 OPT_U64(0, "duration", &kvm->duration,
1336                         "show events other than"
1337                         " HLT (x86 only) or Wait state (s390 only)"
1338                         " that take longer than duration usecs"),
1339                 OPT_UINTEGER(0, "proc-map-timeout", &kvm->opts.proc_map_timeout,
1340                                 "per thread proc mmap processing timeout in ms"),
1341                 OPT_END()
1342         };
1343         const char * const live_usage[] = {
1344                 "perf kvm stat live [<options>]",
1345                 NULL
1346         };
1347         struct perf_data_file file = {
1348                 .mode = PERF_DATA_MODE_WRITE,
1349         };
1350
1351
1352         /* event handling */
1353         kvm->tool.sample = process_sample_event;
1354         kvm->tool.comm   = perf_event__process_comm;
1355         kvm->tool.exit   = perf_event__process_exit;
1356         kvm->tool.fork   = perf_event__process_fork;
1357         kvm->tool.lost   = process_lost_event;
1358         kvm->tool.namespaces  = perf_event__process_namespaces;
1359         kvm->tool.ordered_events = true;
1360         perf_tool__fill_defaults(&kvm->tool);
1361
1362         /* set defaults */
1363         kvm->display_time = 1;
1364         kvm->opts.user_interval = 1;
1365         kvm->opts.mmap_pages = 512;
1366         kvm->opts.target.uses_mmap = false;
1367         kvm->opts.target.uid_str = NULL;
1368         kvm->opts.target.uid = UINT_MAX;
1369         kvm->opts.proc_map_timeout = 500;
1370
1371         symbol__init(NULL);
1372         disable_buildid_cache();
1373
1374         use_browser = 0;
1375
1376         if (argc) {
1377                 argc = parse_options(argc, argv, live_options,
1378                                      live_usage, 0);
1379                 if (argc)
1380                         usage_with_options(live_usage, live_options);
1381         }
1382
1383         kvm->duration *= NSEC_PER_USEC;   /* convert usec to nsec */
1384
1385         /*
1386          * target related setups
1387          */
1388         err = target__validate(&kvm->opts.target);
1389         if (err) {
1390                 target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ);
1391                 ui__warning("%s", errbuf);
1392         }
1393
1394         if (target__none(&kvm->opts.target))
1395                 kvm->opts.target.system_wide = true;
1396
1397
1398         /*
1399          * generate the event list
1400          */
1401         err = setup_kvm_events_tp(kvm);
1402         if (err < 0) {
1403                 pr_err("Unable to setup the kvm tracepoints\n");
1404                 return err;
1405         }
1406
1407         kvm->evlist = kvm_live_event_list();
1408         if (kvm->evlist == NULL) {
1409                 err = -1;
1410                 goto out;
1411         }
1412
1413         symbol_conf.nr_events = kvm->evlist->nr_entries;
1414
1415         if (perf_evlist__create_maps(kvm->evlist, &kvm->opts.target) < 0)
1416                 usage_with_options(live_usage, live_options);
1417
1418         /*
1419          * perf session
1420          */
1421         kvm->session = perf_session__new(&file, false, &kvm->tool);
1422         if (kvm->session == NULL) {
1423                 err = -1;
1424                 goto out;
1425         }
1426         kvm->session->evlist = kvm->evlist;
1427         perf_session__set_id_hdr_size(kvm->session);
1428         ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true);
1429         machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target,
1430                                     kvm->evlist->threads, false, kvm->opts.proc_map_timeout);
1431         err = kvm_live_open_events(kvm);
1432         if (err)
1433                 goto out;
1434
1435         err = kvm_events_live_report(kvm);
1436
1437 out:
1438         perf_session__delete(kvm->session);
1439         kvm->session = NULL;
1440         perf_evlist__delete(kvm->evlist);
1441
1442         return err;
1443 }
1444 #endif
1445
1446 static void print_kvm_stat_usage(void)
1447 {
1448         printf("Usage: perf kvm stat <command>\n\n");
1449
1450         printf("# Available commands:\n");
1451         printf("\trecord: record kvm events\n");
1452         printf("\treport: report statistical data of kvm events\n");
1453         printf("\tlive:   live reporting of statistical data of kvm events\n");
1454
1455         printf("\nOtherwise, it is the alias of 'perf stat':\n");
1456 }
1457
1458 static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
1459 {
1460         struct perf_kvm_stat kvm = {
1461                 .file_name = file_name,
1462
1463                 .trace_vcpu     = -1,
1464                 .report_event   = "vmexit",
1465                 .sort_key       = "sample",
1466
1467         };
1468
1469         if (argc == 1) {
1470                 print_kvm_stat_usage();
1471                 goto perf_stat;
1472         }
1473
1474         if (!strncmp(argv[1], "rec", 3))
1475                 return kvm_events_record(&kvm, argc - 1, argv + 1);
1476
1477         if (!strncmp(argv[1], "rep", 3))
1478                 return kvm_events_report(&kvm, argc - 1 , argv + 1);
1479
1480 #ifdef HAVE_TIMERFD_SUPPORT
1481         if (!strncmp(argv[1], "live", 4))
1482                 return kvm_events_live(&kvm, argc - 1 , argv + 1);
1483 #endif
1484
1485 perf_stat:
1486         return cmd_stat(argc, argv);
1487 }
1488 #endif /* HAVE_KVM_STAT_SUPPORT */
1489
1490 static int __cmd_record(const char *file_name, int argc, const char **argv)
1491 {
1492         int rec_argc, i = 0, j;
1493         const char **rec_argv;
1494
1495         rec_argc = argc + 2;
1496         rec_argv = calloc(rec_argc + 1, sizeof(char *));
1497         rec_argv[i++] = strdup("record");
1498         rec_argv[i++] = strdup("-o");
1499         rec_argv[i++] = strdup(file_name);
1500         for (j = 1; j < argc; j++, i++)
1501                 rec_argv[i] = argv[j];
1502
1503         BUG_ON(i != rec_argc);
1504
1505         return cmd_record(i, rec_argv);
1506 }
1507
1508 static int __cmd_report(const char *file_name, int argc, const char **argv)
1509 {
1510         int rec_argc, i = 0, j;
1511         const char **rec_argv;
1512
1513         rec_argc = argc + 2;
1514         rec_argv = calloc(rec_argc + 1, sizeof(char *));
1515         rec_argv[i++] = strdup("report");
1516         rec_argv[i++] = strdup("-i");
1517         rec_argv[i++] = strdup(file_name);
1518         for (j = 1; j < argc; j++, i++)
1519                 rec_argv[i] = argv[j];
1520
1521         BUG_ON(i != rec_argc);
1522
1523         return cmd_report(i, rec_argv);
1524 }
1525
1526 static int
1527 __cmd_buildid_list(const char *file_name, int argc, const char **argv)
1528 {
1529         int rec_argc, i = 0, j;
1530         const char **rec_argv;
1531
1532         rec_argc = argc + 2;
1533         rec_argv = calloc(rec_argc + 1, sizeof(char *));
1534         rec_argv[i++] = strdup("buildid-list");
1535         rec_argv[i++] = strdup("-i");
1536         rec_argv[i++] = strdup(file_name);
1537         for (j = 1; j < argc; j++, i++)
1538                 rec_argv[i] = argv[j];
1539
1540         BUG_ON(i != rec_argc);
1541
1542         return cmd_buildid_list(i, rec_argv);
1543 }
1544
1545 int cmd_kvm(int argc, const char **argv)
1546 {
1547         const char *file_name = NULL;
1548         const struct option kvm_options[] = {
1549                 OPT_STRING('i', "input", &file_name, "file",
1550                            "Input file name"),
1551                 OPT_STRING('o', "output", &file_name, "file",
1552                            "Output file name"),
1553                 OPT_BOOLEAN(0, "guest", &perf_guest,
1554                             "Collect guest os data"),
1555                 OPT_BOOLEAN(0, "host", &perf_host,
1556                             "Collect host os data"),
1557                 OPT_STRING(0, "guestmount", &symbol_conf.guestmount, "directory",
1558                            "guest mount directory under which every guest os"
1559                            " instance has a subdir"),
1560                 OPT_STRING(0, "guestvmlinux", &symbol_conf.default_guest_vmlinux_name,
1561                            "file", "file saving guest os vmlinux"),
1562                 OPT_STRING(0, "guestkallsyms", &symbol_conf.default_guest_kallsyms,
1563                            "file", "file saving guest os /proc/kallsyms"),
1564                 OPT_STRING(0, "guestmodules", &symbol_conf.default_guest_modules,
1565                            "file", "file saving guest os /proc/modules"),
1566                 OPT_INCR('v', "verbose", &verbose,
1567                             "be more verbose (show counter open errors, etc)"),
1568                 OPT_END()
1569         };
1570
1571         const char *const kvm_subcommands[] = { "top", "record", "report", "diff",
1572                                                 "buildid-list", "stat", NULL };
1573         const char *kvm_usage[] = { NULL, NULL };
1574
1575         perf_host  = 0;
1576         perf_guest = 1;
1577
1578         argc = parse_options_subcommand(argc, argv, kvm_options, kvm_subcommands, kvm_usage,
1579                                         PARSE_OPT_STOP_AT_NON_OPTION);
1580         if (!argc)
1581                 usage_with_options(kvm_usage, kvm_options);
1582
1583         if (!perf_host)
1584                 perf_guest = 1;
1585
1586         if (!file_name) {
1587                 file_name = get_filename_for_perf_kvm();
1588
1589                 if (!file_name) {
1590                         pr_err("Failed to allocate memory for filename\n");
1591                         return -ENOMEM;
1592                 }
1593         }
1594
1595         if (!strncmp(argv[0], "rec", 3))
1596                 return __cmd_record(file_name, argc, argv);
1597         else if (!strncmp(argv[0], "rep", 3))
1598                 return __cmd_report(file_name, argc, argv);
1599         else if (!strncmp(argv[0], "diff", 4))
1600                 return cmd_diff(argc, argv);
1601         else if (!strncmp(argv[0], "top", 3))
1602                 return cmd_top(argc, argv);
1603         else if (!strncmp(argv[0], "buildid-list", 12))
1604                 return __cmd_buildid_list(file_name, argc, argv);
1605 #ifdef HAVE_KVM_STAT_SUPPORT
1606         else if (!strncmp(argv[0], "stat", 4))
1607                 return kvm_cmd_stat(file_name, argc, argv);
1608 #endif
1609         else
1610                 usage_with_options(kvm_usage, kvm_options);
1611
1612         return 0;
1613 }