perf kvm: Switch to new perf_mmap__read_event() interface
authorKan Liang <kan.liang@linux.intel.com>
Thu, 1 Mar 2018 23:08:58 +0000 (18:08 -0500)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 5 Mar 2018 13:41:36 +0000 (10:41 -0300)
The perf kvm still use the legacy interface.

Switch to the new perf_mmap__read_event() interface for perf kvm.

No functional change.

Committer notes:

Tested before and after running:

  # perf kvm stat record

On a machine with a kvm guest, then used:

  # perf kvm stat report

Before/after results match and look like:

  # perf kvm stat record -a sleep 5
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 2.132 MB perf.data.guest (1828 samples) ]
  # perf kvm stat report

  Analyze events for all VMs, all VCPUs:

             VM-EXIT Samples Samples%  Time% Min Time    Max Time    Avg time

      IO_INSTRUCTION     258   40.06%  0.08%   3.51us    122.54us     14.87us (+- 6.76%)
           MSR_WRITE     178   27.64%  0.01%   0.47us      6.34us      2.18us (+- 4.80%)
       EPT_MISCONFIG     148   22.98%  0.03%   3.76us     65.60us     11.22us (+- 8.14%)
                 HLT      47    7.30% 99.88% 181.69us 249988.06us 102061.36us (+-13.49%)
   PAUSE_INSTRUCTION       5    0.78%  0.00%   0.38us      0.79us      0.47us (+-17.05%)
            MSR_READ       4    0.62%  0.00%   1.14us      3.33us      2.67us (+-19.35%)
  EXTERNAL_INTERRUPT       2    0.31%  0.00%   2.15us      2.17us      2.16us (+- 0.30%)
   PENDING_INTERRUPT       1    0.16%  0.00%   2.56us      2.56us      2.56us (+- 0.00%)
    PREEMPTION_TIMER       1    0.16%  0.00%   3.21us      3.21us      3.21us (+- 0.00%)

  Total Samples:644, Total events handled time:4802790.72us.

  #

Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1519945751-37786-1-git-send-email-kan.liang@linux.intel.com
[ Changed bool parameters from 0 to 'false', as per Jiri comment ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-kvm.c

index 55d919dc5bc632b4a967dde8a5dbfdacf5da3f63..d2703d3b83666cac140eefe184a406160681e78a 100644 (file)
@@ -743,16 +743,24 @@ static bool verify_vcpu(int vcpu)
 static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
                                   u64 *mmap_time)
 {
+       struct perf_evlist *evlist = kvm->evlist;
        union perf_event *event;
+       struct perf_mmap *md;
+       u64 end, start;
        u64 timestamp;
        s64 n = 0;
        int err;
 
        *mmap_time = ULLONG_MAX;
-       while ((event = perf_evlist__mmap_read(kvm->evlist, idx)) != NULL) {
-               err = perf_evlist__parse_sample_timestamp(kvm->evlist, event, &timestamp);
+       md = &evlist->mmap[idx];
+       err = perf_mmap__read_init(md, false, &start, &end);
+       if (err < 0)
+               return (err == -EAGAIN) ? 0 : -1;
+
+       while ((event = perf_mmap__read_event(md, false, &start, end)) != NULL) {
+               err = perf_evlist__parse_sample_timestamp(evlist, event, &timestamp);
                if (err) {
-                       perf_evlist__mmap_consume(kvm->evlist, idx);
+                       perf_mmap__consume(md, false);
                        pr_err("Failed to parse sample\n");
                        return -1;
                }
@@ -762,7 +770,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
                 * FIXME: Here we can't consume the event, as perf_session__queue_event will
                 *        point to it, and it'll get possibly overwritten by the kernel.
                 */
-               perf_evlist__mmap_consume(kvm->evlist, idx);
+               perf_mmap__consume(md, false);
 
                if (err) {
                        pr_err("Failed to enqueue sample: %d\n", err);
@@ -779,6 +787,7 @@ static s64 perf_kvm__mmap_read_idx(struct perf_kvm_stat *kvm, int idx,
                        break;
        }
 
+       perf_mmap__read_done(md);
        return n;
 }