Merge branch 'topic/enum-info-cleanup' into for-next
[firefly-linux-kernel-4.4.55.git] / tools / perf / builtin-kvm.c
index f5d3ae483110815e1d3d64c6ed7c96e5762352ec..b65eb0507b38a97bb86b948eec3d6c045b5c27e1 100644 (file)
@@ -376,7 +376,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread,
                                          struct perf_sample *sample)
 {
        /* Only kvm_entry records vcpu id. */
-       if (!thread->priv && kvm_entry_event(evsel)) {
+       if (!thread__priv(thread) && kvm_entry_event(evsel)) {
                struct vcpu_event_record *vcpu_record;
 
                vcpu_record = zalloc(sizeof(*vcpu_record));
@@ -386,10 +386,10 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread,
                }
 
                vcpu_record->vcpu_id = perf_evsel__intval(evsel, sample, VCPU_ID);
-               thread->priv = vcpu_record;
+               thread__set_priv(thread, vcpu_record);
        }
 
-       return thread->priv;
+       return thread__priv(thread);
 }
 
 static bool handle_kvm_event(struct perf_kvm_stat *kvm,
@@ -896,8 +896,7 @@ static int perf_kvm__handle_stdin(void)
 
 static int kvm_events_live_report(struct perf_kvm_stat *kvm)
 {
-       struct pollfd *pollfds = NULL;
-       int nr_fds, nr_stdin, ret, err = -EINVAL;
+       int nr_stdin, ret, err = -EINVAL;
        struct termios save;
 
        /* live flag must be set first */
@@ -919,30 +918,19 @@ static int kvm_events_live_report(struct perf_kvm_stat *kvm)
        signal(SIGINT, sig_handler);
        signal(SIGTERM, sig_handler);
 
-       /* copy pollfds -- need to add timerfd and stdin */
-       nr_fds = kvm->evlist->nr_fds;
-       pollfds = zalloc(sizeof(struct pollfd) * (nr_fds + 2));
-       if (!pollfds) {
-               err = -ENOMEM;
-               goto out;
-       }
-       memcpy(pollfds, kvm->evlist->pollfd,
-               sizeof(struct pollfd) * kvm->evlist->nr_fds);
-
        /* add timer fd */
        if (perf_kvm__timerfd_create(kvm) < 0) {
                err = -1;
                goto out;
        }
 
-       pollfds[nr_fds].fd = kvm->timerfd;
-       pollfds[nr_fds].events = POLLIN;
-       nr_fds++;
+       if (perf_evlist__add_pollfd(kvm->evlist, kvm->timerfd) < 0)
+               goto out;
+
+       nr_stdin = perf_evlist__add_pollfd(kvm->evlist, fileno(stdin));
+       if (nr_stdin < 0)
+               goto out;
 
-       pollfds[nr_fds].fd = fileno(stdin);
-       pollfds[nr_fds].events = POLLIN;
-       nr_stdin = nr_fds;
-       nr_fds++;
        if (fd_set_nonblock(fileno(stdin)) != 0)
                goto out;
 
@@ -950,6 +938,7 @@ static int kvm_events_live_report(struct perf_kvm_stat *kvm)
        perf_evlist__enable(kvm->evlist);
 
        while (!done) {
+               struct fdarray *fda = &kvm->evlist->pollfd;
                int rc;
 
                rc = perf_kvm__mmap_read(kvm);
@@ -960,11 +949,11 @@ static int kvm_events_live_report(struct perf_kvm_stat *kvm)
                if (err)
                        goto out;
 
-               if (pollfds[nr_stdin].revents & POLLIN)
+               if (fda->entries[nr_stdin].revents & POLLIN)
                        done = perf_kvm__handle_stdin();
 
                if (!rc && !done)
-                       err = poll(pollfds, nr_fds, 100);
+                       err = fdarray__poll(fda, 100);
        }
 
        perf_evlist__disable(kvm->evlist);
@@ -979,7 +968,6 @@ out:
                close(kvm->timerfd);
 
        tcsetattr(0, TCSAFLUSH, &save);
-       free(pollfds);
        return err;
 }
 
@@ -1062,7 +1050,7 @@ static int read_events(struct perf_kvm_stat *kvm)
        kvm->session = perf_session__new(&file, false, &kvm->tool);
        if (!kvm->session) {
                pr_err("Initializing perf session failed\n");
-               return -EINVAL;
+               return -1;
        }
 
        symbol__init(&kvm->session->header.env);
@@ -1365,11 +1353,12 @@ static int kvm_events_live(struct perf_kvm_stat *kvm,
         */
        kvm->session = perf_session__new(&file, false, &kvm->tool);
        if (kvm->session == NULL) {
-               err = -ENOMEM;
+               err = -1;
                goto out;
        }
        kvm->session->evlist = kvm->evlist;
        perf_session__set_id_hdr_size(kvm->session);
+       ordered_events__set_copy_on_queue(&kvm->session->ordered_events, true);
        machine__synthesize_threads(&kvm->session->machines.host, &kvm->opts.target,
                                    kvm->evlist->threads, false);
        err = kvm_live_open_events(kvm);