~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to tools/perf/builtin-stat.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
 *
7
7
 * Sample output:
8
8
 
9
 
   $ perf stat ~/hackbench 10
10
 
   Time: 0.104
11
 
 
12
 
    Performance counter stats for '/home/mingo/hackbench':
13
 
 
14
 
       1255.538611  task clock ticks     #      10.143 CPU utilization factor
15
 
             54011  context switches     #       0.043 M/sec
16
 
               385  CPU migrations       #       0.000 M/sec
17
 
             17755  pagefaults           #       0.014 M/sec
18
 
        3808323185  CPU cycles           #    3033.219 M/sec
19
 
        1575111190  instructions         #    1254.530 M/sec
20
 
          17367895  cache references     #      13.833 M/sec
21
 
           7674421  cache misses         #       6.112 M/sec
22
 
 
23
 
    Wall-clock time elapsed:   123.786620 msecs
 
9
   $ perf stat ./hackbench 10
 
10
 
 
11
  Time: 0.118
 
12
 
 
13
  Performance counter stats for './hackbench 10':
 
14
 
 
15
       1708.761321 task-clock                #   11.037 CPUs utilized
 
16
            41,190 context-switches          #    0.024 M/sec
 
17
             6,735 CPU-migrations            #    0.004 M/sec
 
18
            17,318 page-faults               #    0.010 M/sec
 
19
     5,205,202,243 cycles                    #    3.046 GHz
 
20
     3,856,436,920 stalled-cycles-frontend   #   74.09% frontend cycles idle
 
21
     1,600,790,871 stalled-cycles-backend    #   30.75% backend  cycles idle
 
22
     2,603,501,247 instructions              #    0.50  insns per cycle
 
23
                                             #    1.48  stalled cycles per insn
 
24
       484,357,498 branches                  #  283.455 M/sec
 
25
         6,388,934 branch-misses             #    1.32% of all branches
 
26
 
 
27
        0.154822978  seconds time elapsed
24
28
 
25
29
 *
26
 
 * Copyright (C) 2008, Red Hat Inc, Ingo Molnar <mingo@redhat.com>
 
30
 * Copyright (C) 2008-2011, Red Hat Inc, Ingo Molnar <mingo@redhat.com>
27
31
 *
28
32
 * Improvements and fixes by:
29
33
 *
43
47
#include "util/parse-options.h"
44
48
#include "util/parse-events.h"
45
49
#include "util/event.h"
 
50
#include "util/evlist.h"
46
51
#include "util/evsel.h"
47
52
#include "util/debug.h"
 
53
#include "util/color.h"
48
54
#include "util/header.h"
49
55
#include "util/cpumap.h"
50
56
#include "util/thread.h"
 
57
#include "util/thread_map.h"
51
58
 
52
59
#include <sys/prctl.h>
53
60
#include <math.h>
63
70
  { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_PAGE_FAULTS             },
64
71
 
65
72
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CPU_CYCLES              },
 
73
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_FRONTEND },
 
74
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_BACKEND  },
66
75
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_INSTRUCTIONS            },
67
76
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS     },
68
77
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_MISSES           },
69
 
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CACHE_REFERENCES        },
70
 
  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CACHE_MISSES            },
71
 
 
72
 
};
 
78
 
 
79
};
 
80
 
 
81
/*
 
82
 * Detailed stats (-d), covering the L1 and last level data caches:
 
83
 */
 
84
static struct perf_event_attr detailed_attrs[] = {
 
85
 
 
86
  { .type = PERF_TYPE_HW_CACHE,
 
87
    .config =
 
88
         PERF_COUNT_HW_CACHE_L1D                <<  0  |
 
89
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
90
        (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)                          },
 
91
 
 
92
  { .type = PERF_TYPE_HW_CACHE,
 
93
    .config =
 
94
         PERF_COUNT_HW_CACHE_L1D                <<  0  |
 
95
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
96
        (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)                          },
 
97
 
 
98
  { .type = PERF_TYPE_HW_CACHE,
 
99
    .config =
 
100
         PERF_COUNT_HW_CACHE_LL                 <<  0  |
 
101
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
102
        (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)                          },
 
103
 
 
104
  { .type = PERF_TYPE_HW_CACHE,
 
105
    .config =
 
106
         PERF_COUNT_HW_CACHE_LL                 <<  0  |
 
107
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
108
        (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)                          },
 
109
};
 
110
 
 
111
/*
 
112
 * Very detailed stats (-d -d), covering the instruction cache and the TLB caches:
 
113
 */
 
114
static struct perf_event_attr very_detailed_attrs[] = {
 
115
 
 
116
  { .type = PERF_TYPE_HW_CACHE,
 
117
    .config =
 
118
         PERF_COUNT_HW_CACHE_L1I                <<  0  |
 
119
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
120
        (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)                          },
 
121
 
 
122
  { .type = PERF_TYPE_HW_CACHE,
 
123
    .config =
 
124
         PERF_COUNT_HW_CACHE_L1I                <<  0  |
 
125
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
126
        (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)                          },
 
127
 
 
128
  { .type = PERF_TYPE_HW_CACHE,
 
129
    .config =
 
130
         PERF_COUNT_HW_CACHE_DTLB               <<  0  |
 
131
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
132
        (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)                          },
 
133
 
 
134
  { .type = PERF_TYPE_HW_CACHE,
 
135
    .config =
 
136
         PERF_COUNT_HW_CACHE_DTLB               <<  0  |
 
137
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
138
        (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)                          },
 
139
 
 
140
  { .type = PERF_TYPE_HW_CACHE,
 
141
    .config =
 
142
         PERF_COUNT_HW_CACHE_ITLB               <<  0  |
 
143
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
144
        (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)                          },
 
145
 
 
146
  { .type = PERF_TYPE_HW_CACHE,
 
147
    .config =
 
148
         PERF_COUNT_HW_CACHE_ITLB               <<  0  |
 
149
        (PERF_COUNT_HW_CACHE_OP_READ            <<  8) |
 
150
        (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)                          },
 
151
 
 
152
};
 
153
 
 
154
/*
 
155
 * Very, very detailed stats (-d -d -d), adding prefetch events:
 
156
 */
 
157
static struct perf_event_attr very_very_detailed_attrs[] = {
 
158
 
 
159
  { .type = PERF_TYPE_HW_CACHE,
 
160
    .config =
 
161
         PERF_COUNT_HW_CACHE_L1D                <<  0  |
 
162
        (PERF_COUNT_HW_CACHE_OP_PREFETCH        <<  8) |
 
163
        (PERF_COUNT_HW_CACHE_RESULT_ACCESS      << 16)                          },
 
164
 
 
165
  { .type = PERF_TYPE_HW_CACHE,
 
166
    .config =
 
167
         PERF_COUNT_HW_CACHE_L1D                <<  0  |
 
168
        (PERF_COUNT_HW_CACHE_OP_PREFETCH        <<  8) |
 
169
        (PERF_COUNT_HW_CACHE_RESULT_MISS        << 16)                          },
 
170
};
 
171
 
 
172
 
 
173
 
 
174
struct perf_evlist              *evsel_list;
73
175
 
74
176
static bool                     system_wide                     =  false;
75
 
static struct cpu_map           *cpus;
76
177
static int                      run_idx                         =  0;
77
178
 
78
179
static int                      run_count                       =  1;
81
182
static bool                     no_aggr                         = false;
82
183
static pid_t                    target_pid                      = -1;
83
184
static pid_t                    target_tid                      = -1;
84
 
static struct thread_map        *threads;
85
185
static pid_t                    child_pid                       = -1;
86
186
static bool                     null_run                        =  false;
 
187
static int                      detailed_run                    =  0;
 
188
static bool                     sync_run                        =  false;
87
189
static bool                     big_num                         =  true;
88
190
static int                      big_num_opt                     =  -1;
89
191
static const char               *cpu_list;
154
256
 
155
257
struct stats                    runtime_nsecs_stats[MAX_NR_CPUS];
156
258
struct stats                    runtime_cycles_stats[MAX_NR_CPUS];
 
259
struct stats                    runtime_stalled_cycles_front_stats[MAX_NR_CPUS];
 
260
struct stats                    runtime_stalled_cycles_back_stats[MAX_NR_CPUS];
157
261
struct stats                    runtime_branches_stats[MAX_NR_CPUS];
 
262
struct stats                    runtime_cacherefs_stats[MAX_NR_CPUS];
 
263
struct stats                    runtime_l1_dcache_stats[MAX_NR_CPUS];
 
264
struct stats                    runtime_l1_icache_stats[MAX_NR_CPUS];
 
265
struct stats                    runtime_ll_cache_stats[MAX_NR_CPUS];
 
266
struct stats                    runtime_itlb_cache_stats[MAX_NR_CPUS];
 
267
struct stats                    runtime_dtlb_cache_stats[MAX_NR_CPUS];
158
268
struct stats                    walltime_nsecs_stats;
159
269
 
160
270
static int create_perf_stat_counter(struct perf_evsel *evsel)
165
275
                attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED |
166
276
                                    PERF_FORMAT_TOTAL_TIME_RUNNING;
167
277
 
168
 
        if (system_wide)
169
 
                return perf_evsel__open_per_cpu(evsel, cpus);
170
 
 
171
278
        attr->inherit = !no_inherit;
 
279
 
 
280
        if (system_wide)
 
281
                return perf_evsel__open_per_cpu(evsel, evsel_list->cpus, false);
 
282
 
172
283
        if (target_pid == -1 && target_tid == -1) {
173
284
                attr->disabled = 1;
174
285
                attr->enable_on_exec = 1;
175
286
        }
176
287
 
177
 
        return perf_evsel__open_per_thread(evsel, threads);
 
288
        return perf_evsel__open_per_thread(evsel, evsel_list->threads, false);
178
289
}
179
290
 
180
291
/*
190
301
}
191
302
 
192
303
/*
 
304
 * Update various tracking values we maintain to print
 
305
 * more semantic information such as miss/hit ratios,
 
306
 * instruction rates, etc:
 
307
 */
 
308
static void update_shadow_stats(struct perf_evsel *counter, u64 *count)
 
309
{
 
310
        if (perf_evsel__match(counter, SOFTWARE, SW_TASK_CLOCK))
 
311
                update_stats(&runtime_nsecs_stats[0], count[0]);
 
312
        else if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES))
 
313
                update_stats(&runtime_cycles_stats[0], count[0]);
 
314
        else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES_FRONTEND))
 
315
                update_stats(&runtime_stalled_cycles_front_stats[0], count[0]);
 
316
        else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES_BACKEND))
 
317
                update_stats(&runtime_stalled_cycles_back_stats[0], count[0]);
 
318
        else if (perf_evsel__match(counter, HARDWARE, HW_BRANCH_INSTRUCTIONS))
 
319
                update_stats(&runtime_branches_stats[0], count[0]);
 
320
        else if (perf_evsel__match(counter, HARDWARE, HW_CACHE_REFERENCES))
 
321
                update_stats(&runtime_cacherefs_stats[0], count[0]);
 
322
        else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_L1D))
 
323
                update_stats(&runtime_l1_dcache_stats[0], count[0]);
 
324
        else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_L1I))
 
325
                update_stats(&runtime_l1_icache_stats[0], count[0]);
 
326
        else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_LL))
 
327
                update_stats(&runtime_ll_cache_stats[0], count[0]);
 
328
        else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_DTLB))
 
329
                update_stats(&runtime_dtlb_cache_stats[0], count[0]);
 
330
        else if (perf_evsel__match(counter, HW_CACHE, HW_CACHE_ITLB))
 
331
                update_stats(&runtime_itlb_cache_stats[0], count[0]);
 
332
}
 
333
 
 
334
/*
193
335
 * Read out the results of a single counter:
194
336
 * aggregate counts across CPUs in system-wide mode
195
337
 */
199
341
        u64 *count = counter->counts->aggr.values;
200
342
        int i;
201
343
 
202
 
        if (__perf_evsel__read(counter, cpus->nr, threads->nr, scale) < 0)
 
344
        if (__perf_evsel__read(counter, evsel_list->cpus->nr,
 
345
                               evsel_list->threads->nr, scale) < 0)
203
346
                return -1;
204
347
 
205
348
        for (i = 0; i < 3; i++)
213
356
        /*
214
357
         * Save the full runtime - to allow normalization during printout:
215
358
         */
216
 
        if (perf_evsel__match(counter, SOFTWARE, SW_TASK_CLOCK))
217
 
                update_stats(&runtime_nsecs_stats[0], count[0]);
218
 
        if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES))
219
 
                update_stats(&runtime_cycles_stats[0], count[0]);
220
 
        if (perf_evsel__match(counter, HARDWARE, HW_BRANCH_INSTRUCTIONS))
221
 
                update_stats(&runtime_branches_stats[0], count[0]);
 
359
        update_shadow_stats(counter, count);
222
360
 
223
361
        return 0;
224
362
}
232
370
        u64 *count;
233
371
        int cpu;
234
372
 
235
 
        for (cpu = 0; cpu < cpus->nr; cpu++) {
 
373
        for (cpu = 0; cpu < evsel_list->cpus->nr; cpu++) {
236
374
                if (__perf_evsel__read_on_cpu(counter, cpu, 0, scale) < 0)
237
375
                        return -1;
238
376
 
239
377
                count = counter->counts->cpu[cpu].values;
240
378
 
241
 
                if (perf_evsel__match(counter, SOFTWARE, SW_TASK_CLOCK))
242
 
                        update_stats(&runtime_nsecs_stats[cpu], count[0]);
243
 
                if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES))
244
 
                        update_stats(&runtime_cycles_stats[cpu], count[0]);
245
 
                if (perf_evsel__match(counter, HARDWARE, HW_BRANCH_INSTRUCTIONS))
246
 
                        update_stats(&runtime_branches_stats[cpu], count[0]);
 
379
                update_shadow_stats(counter, count);
247
380
        }
248
381
 
249
382
        return 0;
297
430
                }
298
431
 
299
432
                if (target_tid == -1 && target_pid == -1 && !system_wide)
300
 
                        threads->map[0] = child_pid;
 
433
                        evsel_list->threads->map[0] = child_pid;
301
434
 
302
435
                /*
303
436
                 * Wait for the child to be ready to exec.
309
442
                close(child_ready_pipe[0]);
310
443
        }
311
444
 
312
 
        list_for_each_entry(counter, &evsel_list, node) {
 
445
        list_for_each_entry(counter, &evsel_list->entries, node) {
313
446
                if (create_perf_stat_counter(counter) < 0) {
314
 
                        if (errno == -EPERM || errno == -EACCES) {
 
447
                        if (errno == EINVAL || errno == ENOSYS || errno == ENOENT) {
 
448
                                if (verbose)
 
449
                                        ui__warning("%s event is not supported by the kernel.\n",
 
450
                                                    event_name(counter));
 
451
                                continue;
 
452
                        }
 
453
 
 
454
                        if (errno == EPERM || errno == EACCES) {
315
455
                                error("You may not have permission to collect %sstats.\n"
316
456
                                      "\t Consider tweaking"
317
457
                                      " /proc/sys/kernel/perf_event_paranoid or running as root.",
318
458
                                      system_wide ? "system-wide " : "");
319
 
                        } else if (errno == ENOENT) {
320
 
                                error("%s event is not supported. ", event_name(counter));
321
459
                        } else {
322
460
                                error("open_counter returned with %d (%s). "
323
461
                                      "/bin/dmesg may provide additional information.\n",
330
468
                }
331
469
        }
332
470
 
 
471
        if (perf_evlist__set_filters(evsel_list)) {
 
472
                error("failed to set filter with %d (%s)\n", errno,
 
473
                        strerror(errno));
 
474
                return -1;
 
475
        }
 
476
 
333
477
        /*
334
478
         * Enable counters and exec the command:
335
479
         */
347
491
        update_stats(&walltime_nsecs_stats, t1 - t0);
348
492
 
349
493
        if (no_aggr) {
350
 
                list_for_each_entry(counter, &evsel_list, node) {
 
494
                list_for_each_entry(counter, &evsel_list->entries, node) {
351
495
                        read_counter(counter);
352
 
                        perf_evsel__close_fd(counter, cpus->nr, 1);
 
496
                        perf_evsel__close_fd(counter, evsel_list->cpus->nr, 1);
353
497
                }
354
498
        } else {
355
 
                list_for_each_entry(counter, &evsel_list, node) {
 
499
                list_for_each_entry(counter, &evsel_list->entries, node) {
356
500
                        read_counter_aggr(counter);
357
 
                        perf_evsel__close_fd(counter, cpus->nr, threads->nr);
 
501
                        perf_evsel__close_fd(counter, evsel_list->cpus->nr,
 
502
                                             evsel_list->threads->nr);
358
503
                }
359
504
        }
360
505
 
361
506
        return WEXITSTATUS(status);
362
507
}
363
508
 
 
509
static void print_noise_pct(double total, double avg)
 
510
{
 
511
        double pct = 0.0;
 
512
 
 
513
        if (avg)
 
514
                pct = 100.0*total/avg;
 
515
 
 
516
        fprintf(stderr, "  ( +-%6.2f%% )", pct);
 
517
}
 
518
 
364
519
static void print_noise(struct perf_evsel *evsel, double avg)
365
520
{
366
521
        struct perf_stat *ps;
369
524
                return;
370
525
 
371
526
        ps = evsel->priv;
372
 
        fprintf(stderr, "   ( +- %7.3f%% )",
373
 
                        100 * stddev_stats(&ps->res_stats[0]) / avg);
 
527
        print_noise_pct(stddev_stats(&ps->res_stats[0]), avg);
374
528
}
375
529
 
376
530
static void nsec_printout(int cpu, struct perf_evsel *evsel, double avg)
377
531
{
378
532
        double msecs = avg / 1e6;
379
533
        char cpustr[16] = { '\0', };
380
 
        const char *fmt = csv_output ? "%s%.6f%s%s" : "%s%18.6f%s%-24s";
 
534
        const char *fmt = csv_output ? "%s%.6f%s%s" : "%s%18.6f%s%-25s";
381
535
 
382
536
        if (no_aggr)
383
537
                sprintf(cpustr, "CPU%*d%s",
384
538
                        csv_output ? 0 : -4,
385
 
                        cpus->map[cpu], csv_sep);
 
539
                        evsel_list->cpus->map[cpu], csv_sep);
386
540
 
387
541
        fprintf(stderr, fmt, cpustr, msecs, csv_sep, event_name(evsel));
388
542
 
 
543
        if (evsel->cgrp)
 
544
                fprintf(stderr, "%s%s", csv_sep, evsel->cgrp->name);
 
545
 
389
546
        if (csv_output)
390
547
                return;
391
548
 
392
549
        if (perf_evsel__match(evsel, SOFTWARE, SW_TASK_CLOCK))
393
 
                fprintf(stderr, " # %10.3f CPUs ",
394
 
                                avg / avg_stats(&walltime_nsecs_stats));
 
550
                fprintf(stderr, " # %8.3f CPUs utilized          ", avg / avg_stats(&walltime_nsecs_stats));
 
551
}
 
552
 
 
553
static void print_stalled_cycles_frontend(int cpu, struct perf_evsel *evsel __used, double avg)
 
554
{
 
555
        double total, ratio = 0.0;
 
556
        const char *color;
 
557
 
 
558
        total = avg_stats(&runtime_cycles_stats[cpu]);
 
559
 
 
560
        if (total)
 
561
                ratio = avg / total * 100.0;
 
562
 
 
563
        color = PERF_COLOR_NORMAL;
 
564
        if (ratio > 50.0)
 
565
                color = PERF_COLOR_RED;
 
566
        else if (ratio > 30.0)
 
567
                color = PERF_COLOR_MAGENTA;
 
568
        else if (ratio > 10.0)
 
569
                color = PERF_COLOR_YELLOW;
 
570
 
 
571
        fprintf(stderr, " #  ");
 
572
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
573
        fprintf(stderr, " frontend cycles idle   ");
 
574
}
 
575
 
 
576
static void print_stalled_cycles_backend(int cpu, struct perf_evsel *evsel __used, double avg)
 
577
{
 
578
        double total, ratio = 0.0;
 
579
        const char *color;
 
580
 
 
581
        total = avg_stats(&runtime_cycles_stats[cpu]);
 
582
 
 
583
        if (total)
 
584
                ratio = avg / total * 100.0;
 
585
 
 
586
        color = PERF_COLOR_NORMAL;
 
587
        if (ratio > 75.0)
 
588
                color = PERF_COLOR_RED;
 
589
        else if (ratio > 50.0)
 
590
                color = PERF_COLOR_MAGENTA;
 
591
        else if (ratio > 20.0)
 
592
                color = PERF_COLOR_YELLOW;
 
593
 
 
594
        fprintf(stderr, " #  ");
 
595
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
596
        fprintf(stderr, " backend  cycles idle   ");
 
597
}
 
598
 
 
599
static void print_branch_misses(int cpu, struct perf_evsel *evsel __used, double avg)
 
600
{
 
601
        double total, ratio = 0.0;
 
602
        const char *color;
 
603
 
 
604
        total = avg_stats(&runtime_branches_stats[cpu]);
 
605
 
 
606
        if (total)
 
607
                ratio = avg / total * 100.0;
 
608
 
 
609
        color = PERF_COLOR_NORMAL;
 
610
        if (ratio > 20.0)
 
611
                color = PERF_COLOR_RED;
 
612
        else if (ratio > 10.0)
 
613
                color = PERF_COLOR_MAGENTA;
 
614
        else if (ratio > 5.0)
 
615
                color = PERF_COLOR_YELLOW;
 
616
 
 
617
        fprintf(stderr, " #  ");
 
618
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
619
        fprintf(stderr, " of all branches        ");
 
620
}
 
621
 
 
622
static void print_l1_dcache_misses(int cpu, struct perf_evsel *evsel __used, double avg)
 
623
{
 
624
        double total, ratio = 0.0;
 
625
        const char *color;
 
626
 
 
627
        total = avg_stats(&runtime_l1_dcache_stats[cpu]);
 
628
 
 
629
        if (total)
 
630
                ratio = avg / total * 100.0;
 
631
 
 
632
        color = PERF_COLOR_NORMAL;
 
633
        if (ratio > 20.0)
 
634
                color = PERF_COLOR_RED;
 
635
        else if (ratio > 10.0)
 
636
                color = PERF_COLOR_MAGENTA;
 
637
        else if (ratio > 5.0)
 
638
                color = PERF_COLOR_YELLOW;
 
639
 
 
640
        fprintf(stderr, " #  ");
 
641
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
642
        fprintf(stderr, " of all L1-dcache hits  ");
 
643
}
 
644
 
 
645
static void print_l1_icache_misses(int cpu, struct perf_evsel *evsel __used, double avg)
 
646
{
 
647
        double total, ratio = 0.0;
 
648
        const char *color;
 
649
 
 
650
        total = avg_stats(&runtime_l1_icache_stats[cpu]);
 
651
 
 
652
        if (total)
 
653
                ratio = avg / total * 100.0;
 
654
 
 
655
        color = PERF_COLOR_NORMAL;
 
656
        if (ratio > 20.0)
 
657
                color = PERF_COLOR_RED;
 
658
        else if (ratio > 10.0)
 
659
                color = PERF_COLOR_MAGENTA;
 
660
        else if (ratio > 5.0)
 
661
                color = PERF_COLOR_YELLOW;
 
662
 
 
663
        fprintf(stderr, " #  ");
 
664
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
665
        fprintf(stderr, " of all L1-icache hits  ");
 
666
}
 
667
 
 
668
static void print_dtlb_cache_misses(int cpu, struct perf_evsel *evsel __used, double avg)
 
669
{
 
670
        double total, ratio = 0.0;
 
671
        const char *color;
 
672
 
 
673
        total = avg_stats(&runtime_dtlb_cache_stats[cpu]);
 
674
 
 
675
        if (total)
 
676
                ratio = avg / total * 100.0;
 
677
 
 
678
        color = PERF_COLOR_NORMAL;
 
679
        if (ratio > 20.0)
 
680
                color = PERF_COLOR_RED;
 
681
        else if (ratio > 10.0)
 
682
                color = PERF_COLOR_MAGENTA;
 
683
        else if (ratio > 5.0)
 
684
                color = PERF_COLOR_YELLOW;
 
685
 
 
686
        fprintf(stderr, " #  ");
 
687
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
688
        fprintf(stderr, " of all dTLB cache hits ");
 
689
}
 
690
 
 
691
static void print_itlb_cache_misses(int cpu, struct perf_evsel *evsel __used, double avg)
 
692
{
 
693
        double total, ratio = 0.0;
 
694
        const char *color;
 
695
 
 
696
        total = avg_stats(&runtime_itlb_cache_stats[cpu]);
 
697
 
 
698
        if (total)
 
699
                ratio = avg / total * 100.0;
 
700
 
 
701
        color = PERF_COLOR_NORMAL;
 
702
        if (ratio > 20.0)
 
703
                color = PERF_COLOR_RED;
 
704
        else if (ratio > 10.0)
 
705
                color = PERF_COLOR_MAGENTA;
 
706
        else if (ratio > 5.0)
 
707
                color = PERF_COLOR_YELLOW;
 
708
 
 
709
        fprintf(stderr, " #  ");
 
710
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
711
        fprintf(stderr, " of all iTLB cache hits ");
 
712
}
 
713
 
 
714
static void print_ll_cache_misses(int cpu, struct perf_evsel *evsel __used, double avg)
 
715
{
 
716
        double total, ratio = 0.0;
 
717
        const char *color;
 
718
 
 
719
        total = avg_stats(&runtime_ll_cache_stats[cpu]);
 
720
 
 
721
        if (total)
 
722
                ratio = avg / total * 100.0;
 
723
 
 
724
        color = PERF_COLOR_NORMAL;
 
725
        if (ratio > 20.0)
 
726
                color = PERF_COLOR_RED;
 
727
        else if (ratio > 10.0)
 
728
                color = PERF_COLOR_MAGENTA;
 
729
        else if (ratio > 5.0)
 
730
                color = PERF_COLOR_YELLOW;
 
731
 
 
732
        fprintf(stderr, " #  ");
 
733
        color_fprintf(stderr, color, "%6.2f%%", ratio);
 
734
        fprintf(stderr, " of all LL-cache hits   ");
395
735
}
396
736
 
397
737
static void abs_printout(int cpu, struct perf_evsel *evsel, double avg)
403
743
        if (csv_output)
404
744
                fmt = "%s%.0f%s%s";
405
745
        else if (big_num)
406
 
                fmt = "%s%'18.0f%s%-24s";
 
746
                fmt = "%s%'18.0f%s%-25s";
407
747
        else
408
 
                fmt = "%s%18.0f%s%-24s";
 
748
                fmt = "%s%18.0f%s%-25s";
409
749
 
410
750
        if (no_aggr)
411
751
                sprintf(cpustr, "CPU%*d%s",
412
752
                        csv_output ? 0 : -4,
413
 
                        cpus->map[cpu], csv_sep);
 
753
                        evsel_list->cpus->map[cpu], csv_sep);
414
754
        else
415
755
                cpu = 0;
416
756
 
417
757
        fprintf(stderr, fmt, cpustr, avg, csv_sep, event_name(evsel));
418
758
 
 
759
        if (evsel->cgrp)
 
760
                fprintf(stderr, "%s%s", csv_sep, evsel->cgrp->name);
 
761
 
419
762
        if (csv_output)
420
763
                return;
421
764
 
425
768
                if (total)
426
769
                        ratio = avg / total;
427
770
 
428
 
                fprintf(stderr, " # %10.3f IPC  ", ratio);
 
771
                fprintf(stderr, " #   %5.2f  insns per cycle        ", ratio);
 
772
 
 
773
                total = avg_stats(&runtime_stalled_cycles_front_stats[cpu]);
 
774
                total = max(total, avg_stats(&runtime_stalled_cycles_back_stats[cpu]));
 
775
 
 
776
                if (total && avg) {
 
777
                        ratio = total / avg;
 
778
                        fprintf(stderr, "\n                                             #   %5.2f  stalled cycles per insn", ratio);
 
779
                }
 
780
 
429
781
        } else if (perf_evsel__match(evsel, HARDWARE, HW_BRANCH_MISSES) &&
430
782
                        runtime_branches_stats[cpu].n != 0) {
431
 
                total = avg_stats(&runtime_branches_stats[cpu]);
 
783
                print_branch_misses(cpu, evsel, avg);
 
784
        } else if (
 
785
                evsel->attr.type == PERF_TYPE_HW_CACHE &&
 
786
                evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_L1D |
 
787
                                        ((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
 
788
                                        ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
 
789
                        runtime_l1_dcache_stats[cpu].n != 0) {
 
790
                print_l1_dcache_misses(cpu, evsel, avg);
 
791
        } else if (
 
792
                evsel->attr.type == PERF_TYPE_HW_CACHE &&
 
793
                evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_L1I |
 
794
                                        ((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
 
795
                                        ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
 
796
                        runtime_l1_icache_stats[cpu].n != 0) {
 
797
                print_l1_icache_misses(cpu, evsel, avg);
 
798
        } else if (
 
799
                evsel->attr.type == PERF_TYPE_HW_CACHE &&
 
800
                evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_DTLB |
 
801
                                        ((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
 
802
                                        ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
 
803
                        runtime_dtlb_cache_stats[cpu].n != 0) {
 
804
                print_dtlb_cache_misses(cpu, evsel, avg);
 
805
        } else if (
 
806
                evsel->attr.type == PERF_TYPE_HW_CACHE &&
 
807
                evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_ITLB |
 
808
                                        ((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
 
809
                                        ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
 
810
                        runtime_itlb_cache_stats[cpu].n != 0) {
 
811
                print_itlb_cache_misses(cpu, evsel, avg);
 
812
        } else if (
 
813
                evsel->attr.type == PERF_TYPE_HW_CACHE &&
 
814
                evsel->attr.config ==  ( PERF_COUNT_HW_CACHE_LL |
 
815
                                        ((PERF_COUNT_HW_CACHE_OP_READ) << 8) |
 
816
                                        ((PERF_COUNT_HW_CACHE_RESULT_MISS) << 16)) &&
 
817
                        runtime_ll_cache_stats[cpu].n != 0) {
 
818
                print_ll_cache_misses(cpu, evsel, avg);
 
819
        } else if (perf_evsel__match(evsel, HARDWARE, HW_CACHE_MISSES) &&
 
820
                        runtime_cacherefs_stats[cpu].n != 0) {
 
821
                total = avg_stats(&runtime_cacherefs_stats[cpu]);
432
822
 
433
823
                if (total)
434
824
                        ratio = avg * 100 / total;
435
825
 
436
 
                fprintf(stderr, " # %10.3f %%    ", ratio);
437
 
 
 
826
                fprintf(stderr, " # %8.3f %% of all cache refs    ", ratio);
 
827
 
 
828
        } else if (perf_evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES_FRONTEND)) {
 
829
                print_stalled_cycles_frontend(cpu, evsel, avg);
 
830
        } else if (perf_evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES_BACKEND)) {
 
831
                print_stalled_cycles_backend(cpu, evsel, avg);
 
832
        } else if (perf_evsel__match(evsel, HARDWARE, HW_CPU_CYCLES)) {
 
833
                total = avg_stats(&runtime_nsecs_stats[cpu]);
 
834
 
 
835
                if (total)
 
836
                        ratio = 1.0 * avg / total;
 
837
 
 
838
                fprintf(stderr, " # %8.3f GHz                    ", ratio);
438
839
        } else if (runtime_nsecs_stats[cpu].n != 0) {
439
840
                total = avg_stats(&runtime_nsecs_stats[cpu]);
440
841
 
441
842
                if (total)
442
843
                        ratio = 1000.0 * avg / total;
443
844
 
444
 
                fprintf(stderr, " # %10.3f M/sec", ratio);
 
845
                fprintf(stderr, " # %8.3f M/sec                  ", ratio);
 
846
        } else {
 
847
                fprintf(stderr, "                                   ");
445
848
        }
446
849
}
447
850
 
456
859
        int scaled = counter->counts->scaled;
457
860
 
458
861
        if (scaled == -1) {
459
 
                fprintf(stderr, "%*s%s%-24s\n",
 
862
                fprintf(stderr, "%*s%s%*s",
460
863
                        csv_output ? 0 : 18,
461
 
                        "<not counted>", csv_sep, event_name(counter));
 
864
                        "<not counted>",
 
865
                        csv_sep,
 
866
                        csv_output ? 0 : -24,
 
867
                        event_name(counter));
 
868
 
 
869
                if (counter->cgrp)
 
870
                        fprintf(stderr, "%s%s", csv_sep, counter->cgrp->name);
 
871
 
 
872
                fputc('\n', stderr);
462
873
                return;
463
874
        }
464
875
 
480
891
                avg_enabled = avg_stats(&ps->res_stats[1]);
481
892
                avg_running = avg_stats(&ps->res_stats[2]);
482
893
 
483
 
                fprintf(stderr, "  (scaled from %.2f%%)",
484
 
                                100 * avg_running / avg_enabled);
 
894
                fprintf(stderr, " [%5.2f%%]", 100 * avg_running / avg_enabled);
485
895
        }
486
 
 
487
896
        fprintf(stderr, "\n");
488
897
}
489
898
 
496
905
        u64 ena, run, val;
497
906
        int cpu;
498
907
 
499
 
        for (cpu = 0; cpu < cpus->nr; cpu++) {
 
908
        for (cpu = 0; cpu < evsel_list->cpus->nr; cpu++) {
500
909
                val = counter->counts->cpu[cpu].val;
501
910
                ena = counter->counts->cpu[cpu].ena;
502
911
                run = counter->counts->cpu[cpu].run;
503
912
                if (run == 0 || ena == 0) {
504
 
                        fprintf(stderr, "CPU%*d%s%*s%s%-24s",
 
913
                        fprintf(stderr, "CPU%*d%s%*s%s%*s",
505
914
                                csv_output ? 0 : -4,
506
 
                                cpus->map[cpu], csv_sep,
 
915
                                evsel_list->cpus->map[cpu], csv_sep,
507
916
                                csv_output ? 0 : 18,
508
917
                                "<not counted>", csv_sep,
 
918
                                csv_output ? 0 : -24,
509
919
                                event_name(counter));
510
920
 
511
 
                        fprintf(stderr, "\n");
 
921
                        if (counter->cgrp)
 
922
                                fprintf(stderr, "%s%s", csv_sep, counter->cgrp->name);
 
923
 
 
924
                        fputc('\n', stderr);
512
925
                        continue;
513
926
                }
514
927
 
520
933
                if (!csv_output) {
521
934
                        print_noise(counter, 1.0);
522
935
 
523
 
                        if (run != ena) {
524
 
                                fprintf(stderr, "  (scaled from %.2f%%)",
525
 
                                        100.0 * run / ena);
526
 
                        }
 
936
                        if (run != ena)
 
937
                                fprintf(stderr, "  (%.2f%%)", 100.0 * run / ena);
527
938
                }
528
 
                fprintf(stderr, "\n");
 
939
                fputc('\n', stderr);
529
940
        }
530
941
}
531
942
 
555
966
        }
556
967
 
557
968
        if (no_aggr) {
558
 
                list_for_each_entry(counter, &evsel_list, node)
 
969
                list_for_each_entry(counter, &evsel_list->entries, node)
559
970
                        print_counter(counter);
560
971
        } else {
561
 
                list_for_each_entry(counter, &evsel_list, node)
 
972
                list_for_each_entry(counter, &evsel_list->entries, node)
562
973
                        print_counter_aggr(counter);
563
974
        }
564
975
 
565
976
        if (!csv_output) {
566
 
                fprintf(stderr, "\n");
567
 
                fprintf(stderr, " %18.9f  seconds time elapsed",
 
977
                if (!null_run)
 
978
                        fprintf(stderr, "\n");
 
979
                fprintf(stderr, " %17.9f seconds time elapsed",
568
980
                                avg_stats(&walltime_nsecs_stats)/1e9);
569
981
                if (run_count > 1) {
570
 
                        fprintf(stderr, "   ( +- %7.3f%% )",
571
 
                                100*stddev_stats(&walltime_nsecs_stats) /
572
 
                                avg_stats(&walltime_nsecs_stats));
 
982
                        fprintf(stderr, "                                        ");
 
983
                        print_noise_pct(stddev_stats(&walltime_nsecs_stats),
 
984
                                        avg_stats(&walltime_nsecs_stats));
573
985
                }
574
986
                fprintf(stderr, "\n\n");
575
987
        }
610
1022
}
611
1023
 
612
1024
static const struct option options[] = {
613
 
        OPT_CALLBACK('e', "event", NULL, "event",
 
1025
        OPT_CALLBACK('e', "event", &evsel_list, "event",
614
1026
                     "event selector. use 'perf list' to list available events",
615
1027
                     parse_events),
 
1028
        OPT_CALLBACK(0, "filter", &evsel_list, "filter",
 
1029
                     "event filter", parse_filter),
616
1030
        OPT_BOOLEAN('i', "no-inherit", &no_inherit,
617
1031
                    "child tasks do not inherit counters"),
618
1032
        OPT_INTEGER('p', "pid", &target_pid,
629
1043
                    "repeat command and print average + stddev (max: 100)"),
630
1044
        OPT_BOOLEAN('n', "null", &null_run,
631
1045
                    "null run - dont start any counters"),
 
1046
        OPT_INCR('d', "detailed", &detailed_run,
 
1047
                    "detailed run - start a lot of events"),
 
1048
        OPT_BOOLEAN('S', "sync", &sync_run,
 
1049
                    "call sync() before starting a run"),
632
1050
        OPT_CALLBACK_NOOPT('B', "big-num", NULL, NULL, 
633
1051
                           "print large numbers with thousands\' separators",
634
1052
                           stat__set_big_num),
638
1056
                    "disable CPU count aggregation"),
639
1057
        OPT_STRING('x', "field-separator", &csv_sep, "separator",
640
1058
                   "print counts with custom separator"),
 
1059
        OPT_CALLBACK('G', "cgroup", &evsel_list, "name",
 
1060
                     "monitor event in cgroup name only",
 
1061
                     parse_cgroups),
641
1062
        OPT_END()
642
1063
};
643
1064
 
 
1065
/*
 
1066
 * Add default attributes, if there were no attributes specified or
 
1067
 * if -d/--detailed, -d -d or -d -d -d is used:
 
1068
 */
 
1069
static int add_default_attributes(void)
 
1070
{
 
1071
        struct perf_evsel *pos;
 
1072
        size_t attr_nr = 0;
 
1073
        size_t c;
 
1074
 
 
1075
        /* Set attrs if no event is selected and !null_run: */
 
1076
        if (null_run)
 
1077
                return 0;
 
1078
 
 
1079
        if (!evsel_list->nr_entries) {
 
1080
                for (c = 0; c < ARRAY_SIZE(default_attrs); c++) {
 
1081
                        pos = perf_evsel__new(default_attrs + c, c + attr_nr);
 
1082
                        if (pos == NULL)
 
1083
                                return -1;
 
1084
                        perf_evlist__add(evsel_list, pos);
 
1085
                }
 
1086
                attr_nr += c;
 
1087
        }
 
1088
 
 
1089
        /* Detailed events get appended to the event list: */
 
1090
 
 
1091
        if (detailed_run <  1)
 
1092
                return 0;
 
1093
 
 
1094
        /* Append detailed run extra attributes: */
 
1095
        for (c = 0; c < ARRAY_SIZE(detailed_attrs); c++) {
 
1096
                pos = perf_evsel__new(detailed_attrs + c, c + attr_nr);
 
1097
                if (pos == NULL)
 
1098
                        return -1;
 
1099
                perf_evlist__add(evsel_list, pos);
 
1100
        }
 
1101
        attr_nr += c;
 
1102
 
 
1103
        if (detailed_run < 2)
 
1104
                return 0;
 
1105
 
 
1106
        /* Append very detailed run extra attributes: */
 
1107
        for (c = 0; c < ARRAY_SIZE(very_detailed_attrs); c++) {
 
1108
                pos = perf_evsel__new(very_detailed_attrs + c, c + attr_nr);
 
1109
                if (pos == NULL)
 
1110
                        return -1;
 
1111
                perf_evlist__add(evsel_list, pos);
 
1112
        }
 
1113
 
 
1114
        if (detailed_run < 3)
 
1115
                return 0;
 
1116
 
 
1117
        /* Append very, very detailed run extra attributes: */
 
1118
        for (c = 0; c < ARRAY_SIZE(very_very_detailed_attrs); c++) {
 
1119
                pos = perf_evsel__new(very_very_detailed_attrs + c, c + attr_nr);
 
1120
                if (pos == NULL)
 
1121
                        return -1;
 
1122
                perf_evlist__add(evsel_list, pos);
 
1123
        }
 
1124
 
 
1125
 
 
1126
        return 0;
 
1127
}
 
1128
 
644
1129
int cmd_stat(int argc, const char **argv, const char *prefix __used)
645
1130
{
646
1131
        struct perf_evsel *pos;
648
1133
 
649
1134
        setlocale(LC_ALL, "");
650
1135
 
 
1136
        evsel_list = perf_evlist__new(NULL, NULL);
 
1137
        if (evsel_list == NULL)
 
1138
                return -ENOMEM;
 
1139
 
651
1140
        argc = parse_options(argc, argv, options, stat_usage,
652
1141
                PARSE_OPT_STOP_AT_NON_OPTION);
653
1142
 
674
1163
        if (run_count <= 0)
675
1164
                usage_with_options(stat_usage, options);
676
1165
 
677
 
        /* no_aggr is for system-wide only */
678
 
        if (no_aggr && !system_wide)
 
1166
        /* no_aggr, cgroup are for system-wide only */
 
1167
        if ((no_aggr || nr_cgroups) && !system_wide) {
 
1168
                fprintf(stderr, "both cgroup and no-aggregation "
 
1169
                        "modes only available in system-wide mode\n");
 
1170
 
679
1171
                usage_with_options(stat_usage, options);
680
 
 
681
 
        /* Set attrs and nr_counters if no event is selected and !null_run */
682
 
        if (!null_run && !nr_counters) {
683
 
                size_t c;
684
 
 
685
 
                nr_counters = ARRAY_SIZE(default_attrs);
686
 
 
687
 
                for (c = 0; c < ARRAY_SIZE(default_attrs); ++c) {
688
 
                        pos = perf_evsel__new(&default_attrs[c],
689
 
                                              nr_counters);
690
 
                        if (pos == NULL)
691
 
                                goto out;
692
 
                        list_add(&pos->node, &evsel_list);
693
 
                }
694
1172
        }
695
1173
 
 
1174
        if (add_default_attributes())
 
1175
                goto out;
 
1176
 
696
1177
        if (target_pid != -1)
697
1178
                target_tid = target_pid;
698
1179
 
699
 
        threads = thread_map__new(target_pid, target_tid);
700
 
        if (threads == NULL) {
 
1180
        evsel_list->threads = thread_map__new(target_pid, target_tid);
 
1181
        if (evsel_list->threads == NULL) {
701
1182
                pr_err("Problems finding threads of monitor\n");
702
1183
                usage_with_options(stat_usage, options);
703
1184
        }
704
1185
 
705
1186
        if (system_wide)
706
 
                cpus = cpu_map__new(cpu_list);
 
1187
                evsel_list->cpus = cpu_map__new(cpu_list);
707
1188
        else
708
 
                cpus = cpu_map__dummy_new();
 
1189
                evsel_list->cpus = cpu_map__dummy_new();
709
1190
 
710
 
        if (cpus == NULL) {
 
1191
        if (evsel_list->cpus == NULL) {
711
1192
                perror("failed to parse CPUs map");
712
1193
                usage_with_options(stat_usage, options);
713
1194
                return -1;
714
1195
        }
715
1196
 
716
 
        list_for_each_entry(pos, &evsel_list, node) {
 
1197
        list_for_each_entry(pos, &evsel_list->entries, node) {
717
1198
                if (perf_evsel__alloc_stat_priv(pos) < 0 ||
718
 
                    perf_evsel__alloc_counts(pos, cpus->nr) < 0 ||
719
 
                    perf_evsel__alloc_fd(pos, cpus->nr, threads->nr) < 0)
 
1199
                    perf_evsel__alloc_counts(pos, evsel_list->cpus->nr) < 0 ||
 
1200
                    perf_evsel__alloc_fd(pos, evsel_list->cpus->nr, evsel_list->threads->nr) < 0)
720
1201
                        goto out_free_fd;
721
1202
        }
722
1203
 
735
1216
        for (run_idx = 0; run_idx < run_count; run_idx++) {
736
1217
                if (run_count != 1 && verbose)
737
1218
                        fprintf(stderr, "[ perf stat: executing run #%d ... ]\n", run_idx + 1);
 
1219
 
 
1220
                if (sync_run)
 
1221
                        sync();
 
1222
 
738
1223
                status = run_perf_stat(argc, argv);
739
1224
        }
740
1225
 
741
1226
        if (status != -1)
742
1227
                print_stat(argc, argv);
743
1228
out_free_fd:
744
 
        list_for_each_entry(pos, &evsel_list, node)
 
1229
        list_for_each_entry(pos, &evsel_list->entries, node)
745
1230
                perf_evsel__free_stat_priv(pos);
746
 
        perf_evsel_list__delete();
 
1231
        perf_evlist__delete_maps(evsel_list);
747
1232
out:
748
 
        thread_map__delete(threads);
749
 
        threads = NULL;
 
1233
        perf_evlist__delete(evsel_list);
750
1234
        return status;
751
1235
}