mm/migrate: correct failure handling if !hugepage_migration_support()
[firefly-linux-kernel-4.4.55.git] / tools / perf / builtin-kvm.c
index fbc2888d64950040d3f56444d11bc0e828396b31..a7350519c63f528cfb627d736867742b57b1a2e8 100644 (file)
 #include "util/parse-options.h"
 #include "util/trace-event.h"
 #include "util/debug.h"
-#include <lk/debugfs.h>
+#include <api/fs/debugfs.h>
 #include "util/tool.h"
 #include "util/stat.h"
 #include "util/top.h"
+#include "util/data.h"
 
 #include <sys/prctl.h>
+#ifdef HAVE_TIMERFD_SUPPORT
 #include <sys/timerfd.h>
+#endif
 
 #include <termios.h>
 #include <semaphore.h>
@@ -86,7 +89,7 @@ struct exit_reasons_table {
 
 struct perf_kvm_stat {
        struct perf_tool    tool;
-       struct perf_record_opts opts;
+       struct record_opts  opts;
        struct perf_evlist  *evlist;
        struct perf_session *session;
 
@@ -336,6 +339,7 @@ static void init_kvm_event_record(struct perf_kvm_stat *kvm)
                INIT_LIST_HEAD(&kvm->kvm_events_cache[i]);
 }
 
+#ifdef HAVE_TIMERFD_SUPPORT
 static void clear_events_cache_stats(struct list_head *kvm_events_cache)
 {
        struct list_head *head;
@@ -357,6 +361,7 @@ static void clear_events_cache_stats(struct list_head *kvm_events_cache)
                }
        }
 }
+#endif
 
 static int kvm_events_hash_fn(u64 key)
 {
@@ -782,6 +787,7 @@ static void print_result(struct perf_kvm_stat *kvm)
                pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
 }
 
+#ifdef HAVE_TIMERFD_SUPPORT
 static int process_lost_event(struct perf_tool *tool,
                              union perf_event *event __maybe_unused,
                              struct perf_sample *sample __maybe_unused,
@@ -792,6 +798,7 @@ static int process_lost_event(struct perf_tool *tool,
        kvm->lost_events++;
        return 0;
 }
+#endif
 
 static bool skip_sample(struct perf_kvm_stat *kvm,
                        struct perf_sample *sample)
@@ -871,6 +878,7 @@ static bool verify_vcpu(int vcpu)
        return true;
 }
 
+#ifdef HAVE_TIMERFD_SUPPORT
 /* keeping the max events to a modest level to keep
  * the processing of samples per mmap smooth.
  */
@@ -1150,9 +1158,7 @@ out:
        if (kvm->timerfd >= 0)
                close(kvm->timerfd);
 
-       if (pollfds)
-               free(pollfds);
-
+       free(pollfds);
        return err;
 }
 
@@ -1168,7 +1174,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
         * Note: exclude_{guest,host} do not apply here.
         *       This command processes KVM tracepoints from host only
         */
-       list_for_each_entry(pos, &evlist->entries, node) {
+       evlist__for_each(evlist, pos) {
                struct perf_event_attr *attr = &pos->attr;
 
                /* make sure these *are* set */
@@ -1212,6 +1218,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
 out:
        return rc;
 }
+#endif
 
 static int read_events(struct perf_kvm_stat *kvm)
 {
@@ -1222,10 +1229,13 @@ static int read_events(struct perf_kvm_stat *kvm)
                .comm                   = perf_event__process_comm,
                .ordered_samples        = true,
        };
+       struct perf_data_file file = {
+               .path = kvm->file_name,
+               .mode = PERF_DATA_MODE_READ,
+       };
 
        kvm->tool = eops;
-       kvm->session = perf_session__new(kvm->file_name, O_RDONLY, 0, false,
-                                        &kvm->tool);
+       kvm->session = perf_session__new(&file, false, &kvm->tool);
        if (!kvm->session) {
                pr_err("Initializing perf session failed\n");
                return -EINVAL;
@@ -1375,6 +1385,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
        return kvm_events_report_vcpu(kvm);
 }
 
+#ifdef HAVE_TIMERFD_SUPPORT
 static struct perf_evlist *kvm_live_event_list(void)
 {
        struct perf_evlist *evlist;
@@ -1433,8 +1444,9 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
        const struct option live_options[] = {
                OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid",
                        "record events on existing process id"),
-               OPT_UINTEGER('m', "mmap-pages", &kvm->opts.mmap_pages,
-                       "number of mmap data pages"),
+               OPT_CALLBACK('m', "mmap-pages", &kvm->opts.mmap_pages, "pages",
+                       "number of mmap data pages",
+                       perf_evlist__parse_mmap_pages),
                OPT_INCR('v', "verbose", &verbose,
                        "be more verbose (show counter open errors, etc)"),
                OPT_BOOLEAN('a', "all-cpus", &kvm->opts.target.system_wide,
@@ -1456,6 +1468,9 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
                "perf kvm stat live [<options>]",
                NULL
        };
+       struct perf_data_file file = {
+               .mode = PERF_DATA_MODE_WRITE,
+       };
 
 
        /* event handling */
@@ -1493,13 +1508,13 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
        /*
         * target related setups
         */
-       err = perf_target__validate(&kvm->opts.target);
+       err = target__validate(&kvm->opts.target);
        if (err) {
-               perf_target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ);
+               target__strerror(&kvm->opts.target, err, errbuf, BUFSIZ);
                ui__warning("%s", errbuf);
        }
 
-       if (perf_target__none(&kvm->opts.target))
+       if (target__none(&kvm->opts.target))
                kvm->opts.target.system_wide = true;
 
 
@@ -1520,25 +1535,15 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
        /*
         * perf session
         */
-       kvm->session = perf_session__new(NULL, O_WRONLY, false, false, &kvm->tool);
+       kvm->session = perf_session__new(&file, false, &kvm->tool);
        if (kvm->session == NULL) {
                err = -ENOMEM;
                goto out;
        }
        kvm->session->evlist = kvm->evlist;
        perf_session__set_id_hdr_size(kvm->session);
-
-
-       if (perf_target__has_task(&kvm->opts.target))
-               perf_event__synthesize_thread_map(&kvm->tool,
-                                                 kvm->evlist->threads,
-                                                 perf_event__process,
-                                                 &kvm->session->machines.host);
-       else
-               perf_event__synthesize_threads(&kvm->tool, perf_event__process,
-                                              &kvm->session->machines.host);
-
-
+       machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target,
+                                   kvm->evlist->threads, false);
        err = kvm_live_open_events(kvm);
        if (err)
                goto out;
@@ -1551,13 +1556,12 @@ out:
        if (kvm->session)
                perf_session__delete(kvm->session);
        kvm->session = NULL;
-       if (kvm->evlist) {
-               perf_evlist__delete_maps(kvm->evlist);
+       if (kvm->evlist)
                perf_evlist__delete(kvm->evlist);
-       }
 
        return err;
 }
+#endif
 
 static void print_kvm_stat_usage(void)
 {
@@ -1596,8 +1600,10 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
        if (!strncmp(argv[1], "rep", 3))
                return kvm_events_report(&kvm, argc - 1 , argv + 1);
 
+#ifdef HAVE_TIMERFD_SUPPORT
        if (!strncmp(argv[1], "live", 4))
                return kvm_events_live(&kvm, argc - 1 , argv + 1);
+#endif
 
 perf_stat:
        return cmd_stat(argc, argv, NULL);
@@ -1680,6 +1686,8 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused)
                           "file", "file saving guest os /proc/kallsyms"),
                OPT_STRING(0, "guestmodules", &symbol_conf.default_guest_modules,
                           "file", "file saving guest os /proc/modules"),
+               OPT_INCR('v', "verbose", &verbose,
+                           "be more verbose (show counter open errors, etc)"),
                OPT_END()
        };
 
@@ -1701,12 +1709,7 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused)
                perf_guest = 1;
 
        if (!file_name) {
-               if (perf_host && !perf_guest)
-                       file_name = strdup("perf.data.host");
-               else if (!perf_host && perf_guest)
-                       file_name = strdup("perf.data.guest");
-               else
-                       file_name = strdup("perf.data.kvm");
+               file_name = get_filename_for_perf_kvm();
 
                if (!file_name) {
                        pr_err("Failed to allocate memory for filename\n");