aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2014-01-14 11:25:12 -0500
committerIngo Molnar <mingo@kernel.org>2014-01-14 11:25:12 -0500
commit197749981e539c1eb5863f417de6dd4e2c02b76c (patch)
treed7c81373a9ea1b833163e9c36d727b1b6ddab067 /tools/perf
parent1341f3e4c0276aae3de6d902c9202265d89fe438 (diff)
parent26f7f9877234e6b9ed87eff4ca450631bafe0182 (diff)
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf tooling updates from Arnaldo Carvalho de Melo: New features: * perf record: Add --initial-delay option (Andi Kleen) * Column colouring improvements in 'diff' (Ramkumar Ramachandra) Fixes: * Don't show counter information when workload fails (Arnaldo Carvalho de Melo) * Fixup leak on error path in parse events test. (Arnaldo Carvalho de Melo) * Fix --delay option in 'stat' man page (Andi Kleen) * Use the DWARF unwind info only if loaded (Jean Pihet): Developer stuff: * Improve forked workload error reporting by sending the errno in the signal data queueing integer field, using sigqueue and by doing the signal setup in the evlist methods, removing open coded equivalents in various tools. (Arnaldo Carvalho de Melo) * Do more auto exit cleanup shores in the 'evlist' destructor, so that the tools don't have to all do that sequence. (Arnaldo Carvalho de Melo) * Pack 'struct perf_session_env' and 'struct trace' (Arnaldo Carvalho de Melo) * Include tools/lib/api/ in MANIFEST, fixing detached tarballs (Arnaldo Carvalho de Melo) * Add test for building detached source tarballs (Arnaldo Carvalho de Melo) * Shut up libtracevent plugins make message (Jiri Olsa) * Fix installation tests path setup (Jiri Olsa) * Fix id_hdr_size initialization (Jiri Olsa) * Move some header files from tools/perf/ to tools/include/ to make them available to other tools/ dwelling codebases (Namhyung Kim) * Fix 'probe' build when DWARF support libraries not present (Arnaldo Carvalho de Melo) Refactorings: * Move logic to warn about kptr_restrict'ed kernels to separate function in 'report' (Arnaldo Carvalho de Melo) * Move hist browser selection code to separate function (Arnaldo Carvalho de Melo) * Move histogram entries collapsing to separate function (Arnaldo Carvalho de Melo) * Introduce evlist__for_each() & friends (Arnaldo Carvalho de Melo) * Automate setup of FEATURE_CHECK_(C|LD)FLAGS-all variables (Jiri Olsa) * Move arch setup into seprate Makefile (Jiri Olsa) Trivial stuff: * Remove misplaced __maybe_unused in 'stat' (Arnaldo Carvalho de Melo) * Remove old evsel_list usage in 'record' (Arnaldo Carvalho de Melo) * Comment typo fix (Cody P Schafer) * Remove unused test-volatile-register-var.c (Yann Droneaud) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/Documentation/perf-record.txt4
-rw-r--r--tools/perf/Documentation/perf-stat.txt2
-rw-r--r--tools/perf/MANIFEST4
-rw-r--r--tools/perf/Makefile.perf4
-rw-r--r--tools/perf/builtin-annotate.c2
-rw-r--r--tools/perf/builtin-diff.c98
-rw-r--r--tools/perf/builtin-evlist.c2
-rw-r--r--tools/perf/builtin-inject.c2
-rw-r--r--tools/perf/builtin-kvm.c6
-rw-r--r--tools/perf/builtin-record.c82
-rw-r--r--tools/perf/builtin-report.c192
-rw-r--r--tools/perf/builtin-script.c5
-rw-r--r--tools/perf/builtin-stat.c66
-rw-r--r--tools/perf/builtin-top.c14
-rw-r--r--tools/perf/builtin-trace.c30
-rw-r--r--tools/perf/config/Makefile67
-rw-r--r--tools/perf/config/Makefile.arch22
-rw-r--r--tools/perf/config/feature-checks/test-volatile-register-var.c6
-rw-r--r--tools/perf/perf.h1
-rw-r--r--tools/perf/tests/code-reading.c7
-rw-r--r--tools/perf/tests/evsel-roundtrip-name.c2
-rw-r--r--tools/perf/tests/hists_link.c4
-rw-r--r--tools/perf/tests/keep-tracking.c7
-rw-r--r--tools/perf/tests/make40
-rw-r--r--tools/perf/tests/mmap-basic.c25
-rw-r--r--tools/perf/tests/open-syscall-tp-fields.c16
-rw-r--r--tools/perf/tests/parse-events.c10
-rw-r--r--tools/perf/tests/perf-record.c21
-rwxr-xr-xtools/perf/tests/perf-targz-src-pkg21
-rw-r--r--tools/perf/tests/perf-time-to-tsc.c6
-rw-r--r--tools/perf/tests/sw-clock.c18
-rw-r--r--tools/perf/tests/task-exit.c33
-rw-r--r--tools/perf/ui/browsers/hists.c5
-rw-r--r--tools/perf/ui/gtk/hists.c2
-rw-r--r--tools/perf/util/cgroup.c4
-rw-r--r--tools/perf/util/color.c15
-rw-r--r--tools/perf/util/color.h1
-rw-r--r--tools/perf/util/event.c12
-rw-r--r--tools/perf/util/event.h7
-rw-r--r--tools/perf/util/evlist.c78
-rw-r--r--tools/perf/util/evlist.h69
-rw-r--r--tools/perf/util/evsel.c3
-rw-r--r--tools/perf/util/header.c19
-rw-r--r--tools/perf/util/header.h10
-rw-r--r--tools/perf/util/include/asm/bug.h22
-rw-r--r--tools/perf/util/include/linux/compiler.h30
-rw-r--r--tools/perf/util/machine.c1
-rw-r--r--tools/perf/util/parse-events.c5
-rw-r--r--tools/perf/util/pmu.c2
-rw-r--r--tools/perf/util/probe-event.c5
-rw-r--r--tools/perf/util/python.c3
-rw-r--r--tools/perf/util/record.c6
-rw-r--r--tools/perf/util/session.c6
-rw-r--r--tools/perf/util/unwind.c8
54 files changed, 677 insertions, 455 deletions
diff --git a/tools/perf/Documentation/perf-record.txt b/tools/perf/Documentation/perf-record.txt
index c407897f0435..82bffac036e1 100644
--- a/tools/perf/Documentation/perf-record.txt
+++ b/tools/perf/Documentation/perf-record.txt
@@ -209,6 +209,10 @@ overrides that and uses per-thread mmaps. A side-effect of that is that
209inheritance is automatically disabled. --per-thread is ignored with a warning 209inheritance is automatically disabled. --per-thread is ignored with a warning
210if combined with -a or -C options. 210if combined with -a or -C options.
211 211
212--initial-delay msecs::
213After starting the program, wait msecs before measuring. This is useful to
214filter out the startup phase of the program, which is often very different.
215
212SEE ALSO 216SEE ALSO
213-------- 217--------
214linkperf:perf-stat[1], linkperf:perf-list[1] 218linkperf:perf-stat[1], linkperf:perf-list[1]
diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
index 80c7da6732f2..29ee857c09c6 100644
--- a/tools/perf/Documentation/perf-stat.txt
+++ b/tools/perf/Documentation/perf-stat.txt
@@ -133,7 +133,7 @@ use --per-core in addition to -a. (system-wide). The output includes the
133core number and the number of online logical processors on that physical processor. 133core number and the number of online logical processors on that physical processor.
134 134
135-D msecs:: 135-D msecs::
136--initial-delay msecs:: 136--delay msecs::
137After starting the program, wait msecs before measuring. This is useful to 137After starting the program, wait msecs before measuring. This is useful to
138filter out the startup phase of the program, which is often very different. 138filter out the startup phase of the program, which is often very different.
139 139
diff --git a/tools/perf/MANIFEST b/tools/perf/MANIFEST
index 3170a7ff5782..f41572d0dd76 100644
--- a/tools/perf/MANIFEST
+++ b/tools/perf/MANIFEST
@@ -1,9 +1,11 @@
1tools/perf 1tools/perf
2tools/scripts 2tools/scripts
3tools/lib/traceevent 3tools/lib/traceevent
4tools/lib/lk 4tools/lib/api
5tools/lib/symbol/kallsyms.c 5tools/lib/symbol/kallsyms.c
6tools/lib/symbol/kallsyms.h 6tools/lib/symbol/kallsyms.h
7tools/include/asm/bug.h
8tools/include/linux/compiler.h
7include/linux/const.h 9include/linux/const.h
8include/linux/perf_event.h 10include/linux/perf_event.h
9include/linux/rbtree.h 11include/linux/rbtree.h
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 3638b0bd20dc..87d7726cee2d 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -211,7 +211,7 @@ LIB_H += ../../include/linux/hash.h
211LIB_H += ../../include/linux/stringify.h 211LIB_H += ../../include/linux/stringify.h
212LIB_H += util/include/linux/bitmap.h 212LIB_H += util/include/linux/bitmap.h
213LIB_H += util/include/linux/bitops.h 213LIB_H += util/include/linux/bitops.h
214LIB_H += util/include/linux/compiler.h 214LIB_H += ../include/linux/compiler.h
215LIB_H += util/include/linux/const.h 215LIB_H += util/include/linux/const.h
216LIB_H += util/include/linux/ctype.h 216LIB_H += util/include/linux/ctype.h
217LIB_H += util/include/linux/kernel.h 217LIB_H += util/include/linux/kernel.h
@@ -226,7 +226,7 @@ LIB_H += util/include/linux/string.h
226LIB_H += util/include/linux/types.h 226LIB_H += util/include/linux/types.h
227LIB_H += util/include/linux/linkage.h 227LIB_H += util/include/linux/linkage.h
228LIB_H += util/include/asm/asm-offsets.h 228LIB_H += util/include/asm/asm-offsets.h
229LIB_H += util/include/asm/bug.h 229LIB_H += ../include/asm/bug.h
230LIB_H += util/include/asm/byteorder.h 230LIB_H += util/include/asm/byteorder.h
231LIB_H += util/include/asm/hweight.h 231LIB_H += util/include/asm/hweight.h
232LIB_H += util/include/asm/swab.h 232LIB_H += util/include/asm/swab.h
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index ab65057a0317..0da603b79b61 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -232,7 +232,7 @@ static int __cmd_annotate(struct perf_annotate *ann)
232 perf_session__fprintf_dsos(session, stdout); 232 perf_session__fprintf_dsos(session, stdout);
233 233
234 total_nr_samples = 0; 234 total_nr_samples = 0;
235 list_for_each_entry(pos, &session->evlist->entries, node) { 235 evlist__for_each(session->evlist, pos) {
236 struct hists *hists = &pos->hists; 236 struct hists *hists = &pos->hists;
237 u32 nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE]; 237 u32 nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE];
238 238
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index e6a0844bc2f0..a77e31246c00 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -356,9 +356,10 @@ static struct perf_evsel *evsel_match(struct perf_evsel *evsel,
356{ 356{
357 struct perf_evsel *e; 357 struct perf_evsel *e;
358 358
359 list_for_each_entry(e, &evlist->entries, node) 359 evlist__for_each(evlist, e) {
360 if (perf_evsel__match2(evsel, e)) 360 if (perf_evsel__match2(evsel, e))
361 return e; 361 return e;
362 }
362 363
363 return NULL; 364 return NULL;
364} 365}
@@ -367,7 +368,7 @@ static void perf_evlist__collapse_resort(struct perf_evlist *evlist)
367{ 368{
368 struct perf_evsel *evsel; 369 struct perf_evsel *evsel;
369 370
370 list_for_each_entry(evsel, &evlist->entries, node) { 371 evlist__for_each(evlist, evsel) {
371 struct hists *hists = &evsel->hists; 372 struct hists *hists = &evsel->hists;
372 373
373 hists__collapse_resort(hists, NULL); 374 hists__collapse_resort(hists, NULL);
@@ -614,7 +615,7 @@ static void data_process(void)
614 struct perf_evsel *evsel_base; 615 struct perf_evsel *evsel_base;
615 bool first = true; 616 bool first = true;
616 617
617 list_for_each_entry(evsel_base, &evlist_base->entries, node) { 618 evlist__for_each(evlist_base, evsel_base) {
618 struct data__file *d; 619 struct data__file *d;
619 int i; 620 int i;
620 621
@@ -769,6 +770,81 @@ static int hpp__entry_baseline(struct hist_entry *he, char *buf, size_t size)
769 return ret; 770 return ret;
770} 771}
771 772
773static int __hpp__color_compare(struct perf_hpp_fmt *fmt,
774 struct perf_hpp *hpp, struct hist_entry *he,
775 int comparison_method)
776{
777 struct diff_hpp_fmt *dfmt =
778 container_of(fmt, struct diff_hpp_fmt, fmt);
779 struct hist_entry *pair = get_pair_fmt(he, dfmt);
780 double diff;
781 s64 wdiff;
782 char pfmt[20] = " ";
783
784 if (!pair)
785 goto dummy_print;
786
787 switch (comparison_method) {
788 case COMPUTE_DELTA:
789 if (pair->diff.computed)
790 diff = pair->diff.period_ratio_delta;
791 else
792 diff = compute_delta(he, pair);
793
794 if (fabs(diff) < 0.01)
795 goto dummy_print;
796 scnprintf(pfmt, 20, "%%%+d.2f%%%%", dfmt->header_width - 1);
797 return percent_color_snprintf(hpp->buf, hpp->size,
798 pfmt, diff);
799 case COMPUTE_RATIO:
800 if (he->dummy)
801 goto dummy_print;
802 if (pair->diff.computed)
803 diff = pair->diff.period_ratio;
804 else
805 diff = compute_ratio(he, pair);
806
807 scnprintf(pfmt, 20, "%%%d.6f", dfmt->header_width);
808 return value_color_snprintf(hpp->buf, hpp->size,
809 pfmt, diff);
810 case COMPUTE_WEIGHTED_DIFF:
811 if (he->dummy)
812 goto dummy_print;
813 if (pair->diff.computed)
814 wdiff = pair->diff.wdiff;
815 else
816 wdiff = compute_wdiff(he, pair);
817
818 scnprintf(pfmt, 20, "%%14ld", dfmt->header_width);
819 return color_snprintf(hpp->buf, hpp->size,
820 get_percent_color(wdiff),
821 pfmt, wdiff);
822 default:
823 BUG_ON(1);
824 }
825dummy_print:
826 return scnprintf(hpp->buf, hpp->size, "%*s",
827 dfmt->header_width, pfmt);
828}
829
830static int hpp__color_delta(struct perf_hpp_fmt *fmt,
831 struct perf_hpp *hpp, struct hist_entry *he)
832{
833 return __hpp__color_compare(fmt, hpp, he, COMPUTE_DELTA);
834}
835
836static int hpp__color_ratio(struct perf_hpp_fmt *fmt,
837 struct perf_hpp *hpp, struct hist_entry *he)
838{
839 return __hpp__color_compare(fmt, hpp, he, COMPUTE_RATIO);
840}
841
842static int hpp__color_wdiff(struct perf_hpp_fmt *fmt,
843 struct perf_hpp *hpp, struct hist_entry *he)
844{
845 return __hpp__color_compare(fmt, hpp, he, COMPUTE_WEIGHTED_DIFF);
846}
847
772static void 848static void
773hpp__entry_unpair(struct hist_entry *he, int idx, char *buf, size_t size) 849hpp__entry_unpair(struct hist_entry *he, int idx, char *buf, size_t size)
774{ 850{
@@ -940,8 +1016,22 @@ static void data__hpp_register(struct data__file *d, int idx)
940 fmt->entry = hpp__entry_global; 1016 fmt->entry = hpp__entry_global;
941 1017
942 /* TODO more colors */ 1018 /* TODO more colors */
943 if (idx == PERF_HPP_DIFF__BASELINE) 1019 switch (idx) {
1020 case PERF_HPP_DIFF__BASELINE:
944 fmt->color = hpp__color_baseline; 1021 fmt->color = hpp__color_baseline;
1022 break;
1023 case PERF_HPP_DIFF__DELTA:
1024 fmt->color = hpp__color_delta;
1025 break;
1026 case PERF_HPP_DIFF__RATIO:
1027 fmt->color = hpp__color_ratio;
1028 break;
1029 case PERF_HPP_DIFF__WEIGHTED_DIFF:
1030 fmt->color = hpp__color_wdiff;
1031 break;
1032 default:
1033 break;
1034 }
945 1035
946 init_header(d, dfmt); 1036 init_header(d, dfmt);
947 perf_hpp__column_register(fmt); 1037 perf_hpp__column_register(fmt);
diff --git a/tools/perf/builtin-evlist.c b/tools/perf/builtin-evlist.c
index 20b0f12763b0..c99e0de7e54a 100644
--- a/tools/perf/builtin-evlist.c
+++ b/tools/perf/builtin-evlist.c
@@ -29,7 +29,7 @@ static int __cmd_evlist(const char *file_name, struct perf_attr_details *details
29 if (session == NULL) 29 if (session == NULL)
30 return -ENOMEM; 30 return -ENOMEM;
31 31
32 list_for_each_entry(pos, &session->evlist->entries, node) 32 evlist__for_each(session->evlist, pos)
33 perf_evsel__fprintf(pos, details, stdout); 33 perf_evsel__fprintf(pos, details, stdout);
34 34
35 perf_session__delete(session); 35 perf_session__delete(session);
diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c
index c9f6d74e1fd7..b3466018bbd7 100644
--- a/tools/perf/builtin-inject.c
+++ b/tools/perf/builtin-inject.c
@@ -369,7 +369,7 @@ static int __cmd_inject(struct perf_inject *inject)
369 369
370 inject->tool.ordered_samples = true; 370 inject->tool.ordered_samples = true;
371 371
372 list_for_each_entry(evsel, &session->evlist->entries, node) { 372 evlist__for_each(session->evlist, evsel) {
373 const char *name = perf_evsel__name(evsel); 373 const char *name = perf_evsel__name(evsel);
374 374
375 if (!strcmp(name, "sched:sched_switch")) { 375 if (!strcmp(name, "sched:sched_switch")) {
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c
index a6ec1052c291..a7350519c63f 100644
--- a/tools/perf/builtin-kvm.c
+++ b/tools/perf/builtin-kvm.c
@@ -1174,7 +1174,7 @@ static int kvm_live_open_events(struct perf_kvm_stat *kvm)
1174 * Note: exclude_{guest,host} do not apply here. 1174 * Note: exclude_{guest,host} do not apply here.
1175 * This command processes KVM tracepoints from host only 1175 * This command processes KVM tracepoints from host only
1176 */ 1176 */
1177 list_for_each_entry(pos, &evlist->entries, node) { 1177 evlist__for_each(evlist, pos) {
1178 struct perf_event_attr *attr = &pos->attr; 1178 struct perf_event_attr *attr = &pos->attr;
1179 1179
1180 /* make sure these *are* set */ 1180 /* make sure these *are* set */
@@ -1556,10 +1556,8 @@ out:
1556 if (kvm->session) 1556 if (kvm->session)
1557 perf_session__delete(kvm->session); 1557 perf_session__delete(kvm->session);
1558 kvm->session = NULL; 1558 kvm->session = NULL;
1559 if (kvm->evlist) { 1559 if (kvm->evlist)
1560 perf_evlist__delete_maps(kvm->evlist);
1561 perf_evlist__delete(kvm->evlist); 1560 perf_evlist__delete(kvm->evlist);
1562 }
1563 1561
1564 return err; 1562 return err;
1565} 1563}
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 6ec0cbc2a5d5..07d4cf8d3fd3 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -183,7 +183,7 @@ static int record__open(struct record *rec)
183 183
184 perf_evlist__config(evlist, opts); 184 perf_evlist__config(evlist, opts);
185 185
186 list_for_each_entry(pos, &evlist->entries, node) { 186 evlist__for_each(evlist, pos) {
187try_again: 187try_again:
188 if (perf_evsel__open(pos, evlist->cpus, evlist->threads) < 0) { 188 if (perf_evsel__open(pos, evlist->cpus, evlist->threads) < 0) {
189 if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) { 189 if (perf_evsel__fallback(pos, errno, msg, sizeof(msg))) {
@@ -324,7 +324,6 @@ out:
324 324
325static void record__init_features(struct record *rec) 325static void record__init_features(struct record *rec)
326{ 326{
327 struct perf_evlist *evsel_list = rec->evlist;
328 struct perf_session *session = rec->session; 327 struct perf_session *session = rec->session;
329 int feat; 328 int feat;
330 329
@@ -334,13 +333,29 @@ static void record__init_features(struct record *rec)
334 if (rec->no_buildid) 333 if (rec->no_buildid)
335 perf_header__clear_feat(&session->header, HEADER_BUILD_ID); 334 perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
336 335
337 if (!have_tracepoints(&evsel_list->entries)) 336 if (!have_tracepoints(&rec->evlist->entries))
338 perf_header__clear_feat(&session->header, HEADER_TRACING_DATA); 337 perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
339 338
340 if (!rec->opts.branch_stack) 339 if (!rec->opts.branch_stack)
341 perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK); 340 perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
342} 341}
343 342
343static volatile int workload_exec_errno;
344
345/*
346 * perf_evlist__prepare_workload will send a SIGUSR1
347 * if the fork fails, since we asked by setting its
348 * want_signal to true.
349 */
350static void workload_exec_failed_signal(int signo, siginfo_t *info,
351 void *ucontext __maybe_unused)
352{
353 workload_exec_errno = info->si_value.sival_int;
354 done = 1;
355 signr = signo;
356 child_finished = 1;
357}
358
344static int __cmd_record(struct record *rec, int argc, const char **argv) 359static int __cmd_record(struct record *rec, int argc, const char **argv)
345{ 360{
346 int err; 361 int err;
@@ -349,7 +364,6 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
349 struct machine *machine; 364 struct machine *machine;
350 struct perf_tool *tool = &rec->tool; 365 struct perf_tool *tool = &rec->tool;
351 struct record_opts *opts = &rec->opts; 366 struct record_opts *opts = &rec->opts;
352 struct perf_evlist *evsel_list = rec->evlist;
353 struct perf_data_file *file = &rec->file; 367 struct perf_data_file *file = &rec->file;
354 struct perf_session *session; 368 struct perf_session *session;
355 bool disabled = false; 369 bool disabled = false;
@@ -359,7 +373,6 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
359 on_exit(record__sig_exit, rec); 373 on_exit(record__sig_exit, rec);
360 signal(SIGCHLD, sig_handler); 374 signal(SIGCHLD, sig_handler);
361 signal(SIGINT, sig_handler); 375 signal(SIGINT, sig_handler);
362 signal(SIGUSR1, sig_handler);
363 signal(SIGTERM, sig_handler); 376 signal(SIGTERM, sig_handler);
364 377
365 session = perf_session__new(file, false, NULL); 378 session = perf_session__new(file, false, NULL);
@@ -373,9 +386,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
373 record__init_features(rec); 386 record__init_features(rec);
374 387
375 if (forks) { 388 if (forks) {
376 err = perf_evlist__prepare_workload(evsel_list, &opts->target, 389 err = perf_evlist__prepare_workload(rec->evlist, &opts->target,
377 argv, file->is_pipe, 390 argv, file->is_pipe,
378 true); 391 workload_exec_failed_signal);
379 if (err < 0) { 392 if (err < 0) {
380 pr_err("Couldn't run the workload!\n"); 393 pr_err("Couldn't run the workload!\n");
381 goto out_delete_session; 394 goto out_delete_session;
@@ -387,7 +400,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
387 goto out_delete_session; 400 goto out_delete_session;
388 } 401 }
389 402
390 if (!evsel_list->nr_groups) 403 if (!rec->evlist->nr_groups)
391 perf_header__clear_feat(&session->header, HEADER_GROUP_DESC); 404 perf_header__clear_feat(&session->header, HEADER_GROUP_DESC);
392 405
393 /* 406 /*
@@ -400,7 +413,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
400 if (err < 0) 413 if (err < 0)
401 goto out_delete_session; 414 goto out_delete_session;
402 } else { 415 } else {
403 err = perf_session__write_header(session, evsel_list, 416 err = perf_session__write_header(session, rec->evlist,
404 file->fd, false); 417 file->fd, false);
405 if (err < 0) 418 if (err < 0)
406 goto out_delete_session; 419 goto out_delete_session;
@@ -424,7 +437,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
424 goto out_delete_session; 437 goto out_delete_session;
425 } 438 }
426 439
427 if (have_tracepoints(&evsel_list->entries)) { 440 if (have_tracepoints(&rec->evlist->entries)) {
428 /* 441 /*
429 * FIXME err <= 0 here actually means that 442 * FIXME err <= 0 here actually means that
430 * there were no tracepoints so its not really 443 * there were no tracepoints so its not really
@@ -433,7 +446,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
433 * return this more properly and also 446 * return this more properly and also
434 * propagate errors that now are calling die() 447 * propagate errors that now are calling die()
435 */ 448 */
436 err = perf_event__synthesize_tracing_data(tool, file->fd, evsel_list, 449 err = perf_event__synthesize_tracing_data(tool, file->fd, rec->evlist,
437 process_synthesized_event); 450 process_synthesized_event);
438 if (err <= 0) { 451 if (err <= 0) {
439 pr_err("Couldn't record tracing data.\n"); 452 pr_err("Couldn't record tracing data.\n");
@@ -465,7 +478,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
465 perf_event__synthesize_guest_os, tool); 478 perf_event__synthesize_guest_os, tool);
466 } 479 }
467 480
468 err = __machine__synthesize_threads(machine, tool, &opts->target, evsel_list->threads, 481 err = __machine__synthesize_threads(machine, tool, &opts->target, rec->evlist->threads,
469 process_synthesized_event, opts->sample_address); 482 process_synthesized_event, opts->sample_address);
470 if (err != 0) 483 if (err != 0)
471 goto out_delete_session; 484 goto out_delete_session;
@@ -486,14 +499,19 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
486 * (apart from group members) have enable_on_exec=1 set, 499 * (apart from group members) have enable_on_exec=1 set,
487 * so don't spoil it by prematurely enabling them. 500 * so don't spoil it by prematurely enabling them.
488 */ 501 */
489 if (!target__none(&opts->target)) 502 if (!target__none(&opts->target) && !opts->initial_delay)
490 perf_evlist__enable(evsel_list); 503 perf_evlist__enable(rec->evlist);
491 504
492 /* 505 /*
493 * Let the child rip 506 * Let the child rip
494 */ 507 */
495 if (forks) 508 if (forks)
496 perf_evlist__start_workload(evsel_list); 509 perf_evlist__start_workload(rec->evlist);
510
511 if (opts->initial_delay) {
512 usleep(opts->initial_delay * 1000);
513 perf_evlist__enable(rec->evlist);
514 }
497 515
498 for (;;) { 516 for (;;) {
499 int hits = rec->samples; 517 int hits = rec->samples;
@@ -506,7 +524,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
506 if (hits == rec->samples) { 524 if (hits == rec->samples) {
507 if (done) 525 if (done)
508 break; 526 break;
509 err = poll(evsel_list->pollfd, evsel_list->nr_fds, -1); 527 err = poll(rec->evlist->pollfd, rec->evlist->nr_fds, -1);
510 waking++; 528 waking++;
511 } 529 }
512 530
@@ -516,11 +534,19 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
516 * disable events in this case. 534 * disable events in this case.
517 */ 535 */
518 if (done && !disabled && !target__none(&opts->target)) { 536 if (done && !disabled && !target__none(&opts->target)) {
519 perf_evlist__disable(evsel_list); 537 perf_evlist__disable(rec->evlist);
520 disabled = true; 538 disabled = true;
521 } 539 }
522 } 540 }
523 541
542 if (forks && workload_exec_errno) {
543 char msg[512];
544 const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg));
545 pr_err("Workload failed: %s\n", emsg);
546 err = -1;
547 goto out_delete_session;
548 }
549
524 if (quiet || signr == SIGUSR1) 550 if (quiet || signr == SIGUSR1)
525 return 0; 551 return 0;
526 552
@@ -856,6 +882,8 @@ const struct option record_options[] = {
856 OPT_CALLBACK('G', "cgroup", &record.evlist, "name", 882 OPT_CALLBACK('G', "cgroup", &record.evlist, "name",
857 "monitor event in cgroup name only", 883 "monitor event in cgroup name only",
858 parse_cgroups), 884 parse_cgroups),
885 OPT_UINTEGER(0, "initial-delay", &record.opts.initial_delay,
886 "ms to wait before starting measurement after program start"),
859 OPT_STRING('u', "uid", &record.opts.target.uid_str, "user", 887 OPT_STRING('u', "uid", &record.opts.target.uid_str, "user",
860 "user to profile"), 888 "user to profile"),
861 889
@@ -878,16 +906,13 @@ const struct option record_options[] = {
878int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused) 906int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
879{ 907{
880 int err = -ENOMEM; 908 int err = -ENOMEM;
881 struct perf_evlist *evsel_list;
882 struct record *rec = &record; 909 struct record *rec = &record;
883 char errbuf[BUFSIZ]; 910 char errbuf[BUFSIZ];
884 911
885 evsel_list = perf_evlist__new(); 912 rec->evlist = perf_evlist__new();
886 if (evsel_list == NULL) 913 if (rec->evlist == NULL)
887 return -ENOMEM; 914 return -ENOMEM;
888 915
889 rec->evlist = evsel_list;
890
891 argc = parse_options(argc, argv, record_options, record_usage, 916 argc = parse_options(argc, argv, record_options, record_usage,
892 PARSE_OPT_STOP_AT_NON_OPTION); 917 PARSE_OPT_STOP_AT_NON_OPTION);
893 if (!argc && target__none(&rec->opts.target)) 918 if (!argc && target__none(&rec->opts.target))
@@ -914,8 +939,8 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
914 if (rec->no_buildid_cache || rec->no_buildid) 939 if (rec->no_buildid_cache || rec->no_buildid)
915 disable_buildid_cache(); 940 disable_buildid_cache();
916 941
917 if (evsel_list->nr_entries == 0 && 942 if (rec->evlist->nr_entries == 0 &&
918 perf_evlist__add_default(evsel_list) < 0) { 943 perf_evlist__add_default(rec->evlist) < 0) {
919 pr_err("Not enough memory for event selector list\n"); 944 pr_err("Not enough memory for event selector list\n");
920 goto out_symbol_exit; 945 goto out_symbol_exit;
921 } 946 }
@@ -941,20 +966,15 @@ int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused)
941 } 966 }
942 967
943 err = -ENOMEM; 968 err = -ENOMEM;
944 if (perf_evlist__create_maps(evsel_list, &rec->opts.target) < 0) 969 if (perf_evlist__create_maps(rec->evlist, &rec->opts.target) < 0)
945 usage_with_options(record_usage, record_options); 970 usage_with_options(record_usage, record_options);
946 971
947 if (record_opts__config(&rec->opts)) { 972 if (record_opts__config(&rec->opts)) {
948 err = -EINVAL; 973 err = -EINVAL;
949 goto out_free_fd; 974 goto out_symbol_exit;
950 } 975 }
951 976
952 err = __cmd_record(&record, argc, argv); 977 err = __cmd_record(&record, argc, argv);
953
954 perf_evlist__munmap(evsel_list);
955 perf_evlist__close(evsel_list);
956out_free_fd:
957 perf_evlist__delete_maps(evsel_list);
958out_symbol_exit: 978out_symbol_exit:
959 symbol__exit(); 979 symbol__exit();
960 return err; 980 return err;
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index bf8dd2e893e4..46864dd7eb83 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -384,7 +384,7 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
384{ 384{
385 struct perf_evsel *pos; 385 struct perf_evsel *pos;
386 386
387 list_for_each_entry(pos, &evlist->entries, node) { 387 evlist__for_each(evlist, pos) {
388 struct hists *hists = &pos->hists; 388 struct hists *hists = &pos->hists;
389 const char *evname = perf_evsel__name(pos); 389 const char *evname = perf_evsel__name(pos);
390 390
@@ -412,40 +412,11 @@ static int perf_evlist__tty_browse_hists(struct perf_evlist *evlist,
412 return 0; 412 return 0;
413} 413}
414 414
415static int __cmd_report(struct report *rep) 415static void report__warn_kptr_restrict(const struct report *rep)
416{ 416{
417 int ret = -EINVAL; 417 struct map *kernel_map = rep->session->machines.host.vmlinux_maps[MAP__FUNCTION];
418 u64 nr_samples; 418 struct kmap *kernel_kmap = map__kmap(kernel_map);
419 struct perf_session *session = rep->session;
420 struct perf_evsel *pos;
421 struct map *kernel_map;
422 struct kmap *kernel_kmap;
423 const char *help = "For a higher level overview, try: perf report --sort comm,dso";
424 struct ui_progress prog;
425 struct perf_data_file *file = session->file;
426 419
427 signal(SIGINT, sig_handler);
428
429 if (rep->cpu_list) {
430 ret = perf_session__cpu_bitmap(session, rep->cpu_list,
431 rep->cpu_bitmap);
432 if (ret)
433 return ret;
434 }
435
436 if (rep->show_threads)
437 perf_read_values_init(&rep->show_threads_values);
438
439 ret = report__setup_sample_type(rep);
440 if (ret)
441 return ret;
442
443 ret = perf_session__process_events(session, &rep->tool);
444 if (ret)
445 return ret;
446
447 kernel_map = session->machines.host.vmlinux_maps[MAP__FUNCTION];
448 kernel_kmap = map__kmap(kernel_map);
449 if (kernel_map == NULL || 420 if (kernel_map == NULL ||
450 (kernel_map->dso->hit && 421 (kernel_map->dso->hit &&
451 (kernel_kmap->ref_reloc_sym == NULL || 422 (kernel_kmap->ref_reloc_sym == NULL ||
@@ -468,28 +439,73 @@ static int __cmd_report(struct report *rep)
468"Samples in kernel modules can't be resolved as well.\n\n", 439"Samples in kernel modules can't be resolved as well.\n\n",
469 desc); 440 desc);
470 } 441 }
442}
471 443
472 if (use_browser == 0) { 444static int report__gtk_browse_hists(struct report *rep, const char *help)
473 if (verbose > 3) 445{
474 perf_session__fprintf(session, stdout); 446 int (*hist_browser)(struct perf_evlist *evlist, const char *help,
447 struct hist_browser_timer *timer, float min_pcnt);
475 448
476 if (verbose > 2) 449 hist_browser = dlsym(perf_gtk_handle, "perf_evlist__gtk_browse_hists");
477 perf_session__fprintf_dsos(session, stdout);
478 450
479 if (dump_trace) { 451 if (hist_browser == NULL) {
480 perf_session__fprintf_nr_events(session, stdout); 452 ui__error("GTK browser not found!\n");
481 return 0; 453 return -1;
482 }
483 } 454 }
484 455
485 nr_samples = 0; 456 return hist_browser(rep->session->evlist, help, NULL, rep->min_percent);
486 list_for_each_entry(pos, &session->evlist->entries, node) 457}
458
459static int report__browse_hists(struct report *rep)
460{
461 int ret;
462 struct perf_session *session = rep->session;
463 struct perf_evlist *evlist = session->evlist;
464 const char *help = "For a higher level overview, try: perf report --sort comm,dso";
465
466 switch (use_browser) {
467 case 1:
468 ret = perf_evlist__tui_browse_hists(evlist, help, NULL,
469 rep->min_percent,
470 &session->header.env);
471 /*
472 * Usually "ret" is the last pressed key, and we only
473 * care if the key notifies us to switch data file.
474 */
475 if (ret != K_SWITCH_INPUT_DATA)
476 ret = 0;
477 break;
478 case 2:
479 ret = report__gtk_browse_hists(rep, help);
480 break;
481 default:
482 ret = perf_evlist__tty_browse_hists(evlist, rep, help);
483 break;
484 }
485
486 return ret;
487}
488
489static u64 report__collapse_hists(struct report *rep)
490{
491 struct ui_progress prog;
492 struct perf_evsel *pos;
493 u64 nr_samples = 0;
494 /*
495 * Count number of histogram entries to use when showing progress,
496 * reusing nr_samples variable.
497 */
498 evlist__for_each(rep->session->evlist, pos)
487 nr_samples += pos->hists.nr_entries; 499 nr_samples += pos->hists.nr_entries;
488 500
489 ui_progress__init(&prog, nr_samples, "Merging related events..."); 501 ui_progress__init(&prog, nr_samples, "Merging related events...");
490 502 /*
503 * Count total number of samples, will be used to check if this
504 * session had any.
505 */
491 nr_samples = 0; 506 nr_samples = 0;
492 list_for_each_entry(pos, &session->evlist->entries, node) { 507
508 evlist__for_each(rep->session->evlist, pos) {
493 struct hists *hists = &pos->hists; 509 struct hists *hists = &pos->hists;
494 510
495 if (pos->idx == 0) 511 if (pos->idx == 0)
@@ -507,8 +523,57 @@ static int __cmd_report(struct report *rep)
507 hists__link(leader_hists, hists); 523 hists__link(leader_hists, hists);
508 } 524 }
509 } 525 }
526
510 ui_progress__finish(); 527 ui_progress__finish();
511 528
529 return nr_samples;
530}
531
532static int __cmd_report(struct report *rep)
533{
534 int ret;
535 u64 nr_samples;
536 struct perf_session *session = rep->session;
537 struct perf_evsel *pos;
538 struct perf_data_file *file = session->file;
539
540 signal(SIGINT, sig_handler);
541
542 if (rep->cpu_list) {
543 ret = perf_session__cpu_bitmap(session, rep->cpu_list,
544 rep->cpu_bitmap);
545 if (ret)
546 return ret;
547 }
548
549 if (rep->show_threads)
550 perf_read_values_init(&rep->show_threads_values);
551
552 ret = report__setup_sample_type(rep);
553 if (ret)
554 return ret;
555
556 ret = perf_session__process_events(session, &rep->tool);
557 if (ret)
558 return ret;
559
560 report__warn_kptr_restrict(rep);
561
562 if (use_browser == 0) {
563 if (verbose > 3)
564 perf_session__fprintf(session, stdout);
565
566 if (verbose > 2)
567 perf_session__fprintf_dsos(session, stdout);
568
569 if (dump_trace) {
570 perf_session__fprintf_nr_events(session, stdout);
571 return 0;
572 }
573 }
574
575 nr_samples = report__collapse_hists(rep);
576
512 if (session_done()) 577 if (session_done())
513 return 0; 578 return 0;
514 579
@@ -517,41 +582,10 @@ static int __cmd_report(struct report *rep)
517 return 0; 582 return 0;
518 } 583 }
519 584
520 list_for_each_entry(pos, &session->evlist->entries, node) 585 evlist__for_each(session->evlist, pos)
521 hists__output_resort(&pos->hists); 586 hists__output_resort(&pos->hists);
522 587
523 if (use_browser > 0) { 588 return report__browse_hists(rep);
524 if (use_browser == 1) {
525 ret = perf_evlist__tui_browse_hists(session->evlist,
526 help, NULL,
527 rep->min_percent,
528 &session->header.env);
529 /*
530 * Usually "ret" is the last pressed key, and we only
531 * care if the key notifies us to switch data file.
532 */
533 if (ret != K_SWITCH_INPUT_DATA)
534 ret = 0;
535
536 } else if (use_browser == 2) {
537 int (*hist_browser)(struct perf_evlist *,
538 const char *,
539 struct hist_browser_timer *,
540 float min_pcnt);
541
542 hist_browser = dlsym(perf_gtk_handle,
543 "perf_evlist__gtk_browse_hists");
544 if (hist_browser == NULL) {
545 ui__error("GTK browser not found!\n");
546 return ret;
547 }
548 hist_browser(session->evlist, help, NULL,
549 rep->min_percent);
550 }
551 } else
552 perf_evlist__tty_browse_hists(session->evlist, rep, help);
553
554 return ret;
555} 589}
556 590
557static int 591static int
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 6040000bdfa6..9e9c91f5b7fa 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -603,7 +603,7 @@ static int process_attr(struct perf_tool *tool, union perf_event *event,
603 if (evsel->attr.type >= PERF_TYPE_MAX) 603 if (evsel->attr.type >= PERF_TYPE_MAX)
604 return 0; 604 return 0;
605 605
606 list_for_each_entry(pos, &evlist->entries, node) { 606 evlist__for_each(evlist, pos) {
607 if (pos->attr.type == evsel->attr.type && pos != evsel) 607 if (pos->attr.type == evsel->attr.type && pos != evsel)
608 return 0; 608 return 0;
609 } 609 }
@@ -1309,8 +1309,7 @@ static int check_ev_match(char *dir_name, char *scriptname,
1309 snprintf(evname, len + 1, "%s", p); 1309 snprintf(evname, len + 1, "%s", p);
1310 1310
1311 match = 0; 1311 match = 0;
1312 list_for_each_entry(pos, 1312 evlist__for_each(session->evlist, pos) {
1313 &session->evlist->entries, node) {
1314 if (!strcmp(perf_evsel__name(pos), evname)) { 1313 if (!strcmp(perf_evsel__name(pos), evname)) {
1315 match = 1; 1314 match = 1;
1316 break; 1315 break;
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 106a5e5b7842..8b0e1c9234d9 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -214,7 +214,7 @@ static void perf_evlist__free_stats(struct perf_evlist *evlist)
214{ 214{
215 struct perf_evsel *evsel; 215 struct perf_evsel *evsel;
216 216
217 list_for_each_entry(evsel, &evlist->entries, node) { 217 evlist__for_each(evlist, evsel) {
218 perf_evsel__free_stat_priv(evsel); 218 perf_evsel__free_stat_priv(evsel);
219 perf_evsel__free_counts(evsel); 219 perf_evsel__free_counts(evsel);
220 perf_evsel__free_prev_raw_counts(evsel); 220 perf_evsel__free_prev_raw_counts(evsel);
@@ -225,7 +225,7 @@ static int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw)
225{ 225{
226 struct perf_evsel *evsel; 226 struct perf_evsel *evsel;
227 227
228 list_for_each_entry(evsel, &evlist->entries, node) { 228 evlist__for_each(evlist, evsel) {
229 if (perf_evsel__alloc_stat_priv(evsel) < 0 || 229 if (perf_evsel__alloc_stat_priv(evsel) < 0 ||
230 perf_evsel__alloc_counts(evsel, perf_evsel__nr_cpus(evsel)) < 0 || 230 perf_evsel__alloc_counts(evsel, perf_evsel__nr_cpus(evsel)) < 0 ||
231 (alloc_raw && perf_evsel__alloc_prev_raw_counts(evsel) < 0)) 231 (alloc_raw && perf_evsel__alloc_prev_raw_counts(evsel) < 0))
@@ -259,7 +259,7 @@ static void perf_stat__reset_stats(struct perf_evlist *evlist)
259{ 259{
260 struct perf_evsel *evsel; 260 struct perf_evsel *evsel;
261 261
262 list_for_each_entry(evsel, &evlist->entries, node) { 262 evlist__for_each(evlist, evsel) {
263 perf_evsel__reset_stat_priv(evsel); 263 perf_evsel__reset_stat_priv(evsel);
264 perf_evsel__reset_counts(evsel, perf_evsel__nr_cpus(evsel)); 264 perf_evsel__reset_counts(evsel, perf_evsel__nr_cpus(evsel));
265 } 265 }
@@ -326,13 +326,13 @@ static struct perf_evsel *nth_evsel(int n)
326 326
327 /* Assumes this only called when evsel_list does not change anymore. */ 327 /* Assumes this only called when evsel_list does not change anymore. */
328 if (!array) { 328 if (!array) {
329 list_for_each_entry(ev, &evsel_list->entries, node) 329 evlist__for_each(evsel_list, ev)
330 array_len++; 330 array_len++;
331 array = malloc(array_len * sizeof(void *)); 331 array = malloc(array_len * sizeof(void *));
332 if (!array) 332 if (!array)
333 exit(ENOMEM); 333 exit(ENOMEM);
334 j = 0; 334 j = 0;
335 list_for_each_entry(ev, &evsel_list->entries, node) 335 evlist__for_each(evsel_list, ev)
336 array[j++] = ev; 336 array[j++] = ev;
337 } 337 }
338 if (n < array_len) 338 if (n < array_len)
@@ -440,13 +440,13 @@ static void print_interval(void)
440 char prefix[64]; 440 char prefix[64];
441 441
442 if (aggr_mode == AGGR_GLOBAL) { 442 if (aggr_mode == AGGR_GLOBAL) {
443 list_for_each_entry(counter, &evsel_list->entries, node) { 443 evlist__for_each(evsel_list, counter) {
444 ps = counter->priv; 444 ps = counter->priv;
445 memset(ps->res_stats, 0, sizeof(ps->res_stats)); 445 memset(ps->res_stats, 0, sizeof(ps->res_stats));
446 read_counter_aggr(counter); 446 read_counter_aggr(counter);
447 } 447 }
448 } else { 448 } else {
449 list_for_each_entry(counter, &evsel_list->entries, node) { 449 evlist__for_each(evsel_list, counter) {
450 ps = counter->priv; 450 ps = counter->priv;
451 memset(ps->res_stats, 0, sizeof(ps->res_stats)); 451 memset(ps->res_stats, 0, sizeof(ps->res_stats));
452 read_counter(counter); 452 read_counter(counter);
@@ -483,12 +483,12 @@ static void print_interval(void)
483 print_aggr(prefix); 483 print_aggr(prefix);
484 break; 484 break;
485 case AGGR_NONE: 485 case AGGR_NONE:
486 list_for_each_entry(counter, &evsel_list->entries, node) 486 evlist__for_each(evsel_list, counter)
487 print_counter(counter, prefix); 487 print_counter(counter, prefix);
488 break; 488 break;
489 case AGGR_GLOBAL: 489 case AGGR_GLOBAL:
490 default: 490 default:
491 list_for_each_entry(counter, &evsel_list->entries, node) 491 evlist__for_each(evsel_list, counter)
492 print_counter_aggr(counter, prefix); 492 print_counter_aggr(counter, prefix);
493 } 493 }
494 494
@@ -504,11 +504,24 @@ static void handle_initial_delay(void)
504 nthreads = thread_map__nr(evsel_list->threads); 504 nthreads = thread_map__nr(evsel_list->threads);
505 505
506 usleep(initial_delay * 1000); 506 usleep(initial_delay * 1000);
507 list_for_each_entry(counter, &evsel_list->entries, node) 507 evlist__for_each(evsel_list, counter)
508 perf_evsel__enable(counter, ncpus, nthreads); 508 perf_evsel__enable(counter, ncpus, nthreads);
509 } 509 }
510} 510}
511 511
512static volatile int workload_exec_errno;
513
514/*
515 * perf_evlist__prepare_workload will send a SIGUSR1
516 * if the fork fails, since we asked by setting its
517 * want_signal to true.
518 */
519static void workload_exec_failed_signal(int signo __maybe_unused, siginfo_t *info,
520 void *ucontext __maybe_unused)
521{
522 workload_exec_errno = info->si_value.sival_int;
523}
524
512static int __run_perf_stat(int argc, const char **argv) 525static int __run_perf_stat(int argc, const char **argv)
513{ 526{
514 char msg[512]; 527 char msg[512];
@@ -528,8 +541,8 @@ static int __run_perf_stat(int argc, const char **argv)
528 } 541 }
529 542
530 if (forks) { 543 if (forks) {
531 if (perf_evlist__prepare_workload(evsel_list, &target, argv, 544 if (perf_evlist__prepare_workload(evsel_list, &target, argv, false,
532 false, false) < 0) { 545 workload_exec_failed_signal) < 0) {
533 perror("failed to prepare workload"); 546 perror("failed to prepare workload");
534 return -1; 547 return -1;
535 } 548 }
@@ -539,7 +552,7 @@ static int __run_perf_stat(int argc, const char **argv)
539 if (group) 552 if (group)
540 perf_evlist__set_leader(evsel_list); 553 perf_evlist__set_leader(evsel_list);
541 554
542 list_for_each_entry(counter, &evsel_list->entries, node) { 555 evlist__for_each(evsel_list, counter) {
543 if (create_perf_stat_counter(counter) < 0) { 556 if (create_perf_stat_counter(counter) < 0) {
544 /* 557 /*
545 * PPC returns ENXIO for HW counters until 2.6.37 558 * PPC returns ENXIO for HW counters until 2.6.37
@@ -594,6 +607,13 @@ static int __run_perf_stat(int argc, const char **argv)
594 } 607 }
595 } 608 }
596 wait(&status); 609 wait(&status);
610
611 if (workload_exec_errno) {
612 const char *emsg = strerror_r(workload_exec_errno, msg, sizeof(msg));
613 pr_err("Workload failed: %s\n", emsg);
614 return -1;
615 }
616
597 if (WIFSIGNALED(status)) 617 if (WIFSIGNALED(status))
598 psignal(WTERMSIG(status), argv[0]); 618 psignal(WTERMSIG(status), argv[0]);
599 } else { 619 } else {
@@ -610,13 +630,13 @@ static int __run_perf_stat(int argc, const char **argv)
610 update_stats(&walltime_nsecs_stats, t1 - t0); 630 update_stats(&walltime_nsecs_stats, t1 - t0);
611 631
612 if (aggr_mode == AGGR_GLOBAL) { 632 if (aggr_mode == AGGR_GLOBAL) {
613 list_for_each_entry(counter, &evsel_list->entries, node) { 633 evlist__for_each(evsel_list, counter) {
614 read_counter_aggr(counter); 634 read_counter_aggr(counter);
615 perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), 635 perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter),
616 thread_map__nr(evsel_list->threads)); 636 thread_map__nr(evsel_list->threads));
617 } 637 }
618 } else { 638 } else {
619 list_for_each_entry(counter, &evsel_list->entries, node) { 639 evlist__for_each(evsel_list, counter) {
620 read_counter(counter); 640 read_counter(counter);
621 perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), 1); 641 perf_evsel__close_fd(counter, perf_evsel__nr_cpus(counter), 1);
622 } 642 }
@@ -625,7 +645,7 @@ static int __run_perf_stat(int argc, const char **argv)
625 return WEXITSTATUS(status); 645 return WEXITSTATUS(status);
626} 646}
627 647
628static int run_perf_stat(int argc __maybe_unused, const char **argv) 648static int run_perf_stat(int argc, const char **argv)
629{ 649{
630 int ret; 650 int ret;
631 651
@@ -1097,7 +1117,7 @@ static void print_aggr(char *prefix)
1097 1117
1098 for (s = 0; s < aggr_map->nr; s++) { 1118 for (s = 0; s < aggr_map->nr; s++) {
1099 id = aggr_map->map[s]; 1119 id = aggr_map->map[s];
1100 list_for_each_entry(counter, &evsel_list->entries, node) { 1120 evlist__for_each(evsel_list, counter) {
1101 val = ena = run = 0; 1121 val = ena = run = 0;
1102 nr = 0; 1122 nr = 0;
1103 for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) { 1123 for (cpu = 0; cpu < perf_evsel__nr_cpus(counter); cpu++) {
@@ -1308,11 +1328,11 @@ static void print_stat(int argc, const char **argv)
1308 print_aggr(NULL); 1328 print_aggr(NULL);
1309 break; 1329 break;
1310 case AGGR_GLOBAL: 1330 case AGGR_GLOBAL:
1311 list_for_each_entry(counter, &evsel_list->entries, node) 1331 evlist__for_each(evsel_list, counter)
1312 print_counter_aggr(counter, NULL); 1332 print_counter_aggr(counter, NULL);
1313 break; 1333 break;
1314 case AGGR_NONE: 1334 case AGGR_NONE:
1315 list_for_each_entry(counter, &evsel_list->entries, node) 1335 evlist__for_each(evsel_list, counter)
1316 print_counter(counter, NULL); 1336 print_counter(counter, NULL);
1317 break; 1337 break;
1318 default: 1338 default:
@@ -1762,14 +1782,14 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
1762 if (interval && interval < 100) { 1782 if (interval && interval < 100) {
1763 pr_err("print interval must be >= 100ms\n"); 1783 pr_err("print interval must be >= 100ms\n");
1764 parse_options_usage(stat_usage, options, "I", 1); 1784 parse_options_usage(stat_usage, options, "I", 1);
1765 goto out_free_maps; 1785 goto out;
1766 } 1786 }
1767 1787
1768 if (perf_evlist__alloc_stats(evsel_list, interval)) 1788 if (perf_evlist__alloc_stats(evsel_list, interval))
1769 goto out_free_maps; 1789 goto out;
1770 1790
1771 if (perf_stat_init_aggr_mode()) 1791 if (perf_stat_init_aggr_mode())
1772 goto out_free_maps; 1792 goto out;
1773 1793
1774 /* 1794 /*
1775 * We dont want to block the signals - that would cause 1795 * We dont want to block the signals - that would cause
@@ -1801,8 +1821,6 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
1801 print_stat(argc, argv); 1821 print_stat(argc, argv);
1802 1822
1803 perf_evlist__free_stats(evsel_list); 1823 perf_evlist__free_stats(evsel_list);
1804out_free_maps:
1805 perf_evlist__delete_maps(evsel_list);
1806out: 1824out:
1807 perf_evlist__delete(evsel_list); 1825 perf_evlist__delete(evsel_list);
1808 return status; 1826 return status;
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 172e91a9ce62..569dd87690ef 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -482,7 +482,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
482 482
483 fprintf(stderr, "\nAvailable events:"); 483 fprintf(stderr, "\nAvailable events:");
484 484
485 list_for_each_entry(top->sym_evsel, &top->evlist->entries, node) 485 evlist__for_each(top->evlist, top->sym_evsel)
486 fprintf(stderr, "\n\t%d %s", top->sym_evsel->idx, perf_evsel__name(top->sym_evsel)); 486 fprintf(stderr, "\n\t%d %s", top->sym_evsel->idx, perf_evsel__name(top->sym_evsel));
487 487
488 prompt_integer(&counter, "Enter details event counter"); 488 prompt_integer(&counter, "Enter details event counter");
@@ -493,7 +493,7 @@ static bool perf_top__handle_keypress(struct perf_top *top, int c)
493 sleep(1); 493 sleep(1);
494 break; 494 break;
495 } 495 }
496 list_for_each_entry(top->sym_evsel, &top->evlist->entries, node) 496 evlist__for_each(top->evlist, top->sym_evsel)
497 if (top->sym_evsel->idx == counter) 497 if (top->sym_evsel->idx == counter)
498 break; 498 break;
499 } else 499 } else
@@ -575,7 +575,7 @@ static void *display_thread_tui(void *arg)
575 * Zooming in/out UIDs. For now juse use whatever the user passed 575 * Zooming in/out UIDs. For now juse use whatever the user passed
576 * via --uid. 576 * via --uid.
577 */ 577 */
578 list_for_each_entry(pos, &top->evlist->entries, node) 578 evlist__for_each(top->evlist, pos)
579 pos->hists.uid_filter_str = top->record_opts.target.uid_str; 579 pos->hists.uid_filter_str = top->record_opts.target.uid_str;
580 580
581 perf_evlist__tui_browse_hists(top->evlist, help, &hbt, top->min_percent, 581 perf_evlist__tui_browse_hists(top->evlist, help, &hbt, top->min_percent,
@@ -858,7 +858,7 @@ static int perf_top__start_counters(struct perf_top *top)
858 858
859 perf_evlist__config(evlist, opts); 859 perf_evlist__config(evlist, opts);
860 860
861 list_for_each_entry(counter, &evlist->entries, node) { 861 evlist__for_each(evlist, counter) {
862try_again: 862try_again:
863 if (perf_evsel__open(counter, top->evlist->cpus, 863 if (perf_evsel__open(counter, top->evlist->cpus,
864 top->evlist->threads) < 0) { 864 top->evlist->threads) < 0) {
@@ -1171,7 +1171,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
1171 if (!top.evlist->nr_entries && 1171 if (!top.evlist->nr_entries &&
1172 perf_evlist__add_default(top.evlist) < 0) { 1172 perf_evlist__add_default(top.evlist) < 0) {
1173 ui__error("Not enough memory for event selector list\n"); 1173 ui__error("Not enough memory for event selector list\n");
1174 goto out_delete_maps; 1174 goto out_delete_evlist;
1175 } 1175 }
1176 1176
1177 symbol_conf.nr_events = top.evlist->nr_entries; 1177 symbol_conf.nr_events = top.evlist->nr_entries;
@@ -1181,7 +1181,7 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
1181 1181
1182 if (record_opts__config(opts)) { 1182 if (record_opts__config(opts)) {
1183 status = -EINVAL; 1183 status = -EINVAL;
1184 goto out_delete_maps; 1184 goto out_delete_evlist;
1185 } 1185 }
1186 1186
1187 top.sym_evsel = perf_evlist__first(top.evlist); 1187 top.sym_evsel = perf_evlist__first(top.evlist);
@@ -1206,8 +1206,6 @@ int cmd_top(int argc, const char **argv, const char *prefix __maybe_unused)
1206 1206
1207 status = __cmd_top(&top); 1207 status = __cmd_top(&top);
1208 1208
1209out_delete_maps:
1210 perf_evlist__delete_maps(top.evlist);
1211out_delete_evlist: 1209out_delete_evlist:
1212 perf_evlist__delete(top.evlist); 1210 perf_evlist__delete(top.evlist);
1213 1211
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index c5b4bc51175c..4bd44aba343e 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1160,26 +1160,27 @@ struct trace {
1160 struct record_opts opts; 1160 struct record_opts opts;
1161 struct machine *host; 1161 struct machine *host;
1162 u64 base_time; 1162 u64 base_time;
1163 bool full_time;
1164 FILE *output; 1163 FILE *output;
1165 unsigned long nr_events; 1164 unsigned long nr_events;
1166 struct strlist *ev_qualifier; 1165 struct strlist *ev_qualifier;
1167 bool not_ev_qualifier;
1168 bool live;
1169 const char *last_vfs_getname; 1166 const char *last_vfs_getname;
1170 struct intlist *tid_list; 1167 struct intlist *tid_list;
1171 struct intlist *pid_list; 1168 struct intlist *pid_list;
1169 double duration_filter;
1170 double runtime_ms;
1171 struct {
1172 u64 vfs_getname,
1173 proc_getname;
1174 } stats;
1175 bool not_ev_qualifier;
1176 bool live;
1177 bool full_time;
1172 bool sched; 1178 bool sched;
1173 bool multiple_threads; 1179 bool multiple_threads;
1174 bool summary; 1180 bool summary;
1175 bool summary_only; 1181 bool summary_only;
1176 bool show_comm; 1182 bool show_comm;
1177 bool show_tool_stats; 1183 bool show_tool_stats;
1178 double duration_filter;
1179 double runtime_ms;
1180 struct {
1181 u64 vfs_getname, proc_getname;
1182 } stats;
1183}; 1184};
1184 1185
1185static int trace__set_fd_pathname(struct thread *thread, int fd, const char *pathname) 1186static int trace__set_fd_pathname(struct thread *thread, int fd, const char *pathname)
@@ -1885,7 +1886,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
1885 err = trace__symbols_init(trace, evlist); 1886 err = trace__symbols_init(trace, evlist);
1886 if (err < 0) { 1887 if (err < 0) {
1887 fprintf(trace->output, "Problems initializing symbol libraries!\n"); 1888 fprintf(trace->output, "Problems initializing symbol libraries!\n");
1888 goto out_delete_maps; 1889 goto out_delete_evlist;
1889 } 1890 }
1890 1891
1891 perf_evlist__config(evlist, &trace->opts); 1892 perf_evlist__config(evlist, &trace->opts);
@@ -1895,10 +1896,10 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
1895 1896
1896 if (forks) { 1897 if (forks) {
1897 err = perf_evlist__prepare_workload(evlist, &trace->opts.target, 1898 err = perf_evlist__prepare_workload(evlist, &trace->opts.target,
1898 argv, false, false); 1899 argv, false, NULL);
1899 if (err < 0) { 1900 if (err < 0) {
1900 fprintf(trace->output, "Couldn't run the workload!\n"); 1901 fprintf(trace->output, "Couldn't run the workload!\n");
1901 goto out_delete_maps; 1902 goto out_delete_evlist;
1902 } 1903 }
1903 } 1904 }
1904 1905
@@ -1909,7 +1910,7 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
1909 err = perf_evlist__mmap(evlist, trace->opts.mmap_pages, false); 1910 err = perf_evlist__mmap(evlist, trace->opts.mmap_pages, false);
1910 if (err < 0) { 1911 if (err < 0) {
1911 fprintf(trace->output, "Couldn't mmap the events: %s\n", strerror(errno)); 1912 fprintf(trace->output, "Couldn't mmap the events: %s\n", strerror(errno));
1912 goto out_close_evlist; 1913 goto out_delete_evlist;
1913 } 1914 }
1914 1915
1915 perf_evlist__enable(evlist); 1916 perf_evlist__enable(evlist);
@@ -1993,11 +1994,6 @@ out_disable:
1993 } 1994 }
1994 } 1995 }
1995 1996
1996 perf_evlist__munmap(evlist);
1997out_close_evlist:
1998 perf_evlist__close(evlist);
1999out_delete_maps:
2000 perf_evlist__delete_maps(evlist);
2001out_delete_evlist: 1997out_delete_evlist:
2002 perf_evlist__delete(evlist); 1998 perf_evlist__delete(evlist);
2003out: 1999out:
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile
index 14faeeb0d752..01dd43df0d04 100644
--- a/tools/perf/config/Makefile
+++ b/tools/perf/config/Makefile
@@ -1,28 +1,26 @@
1uname_M := $(shell uname -m 2>/dev/null || echo not)
2 1
3ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ 2ifeq ($(src-perf),)
4 -e s/arm.*/arm/ -e s/sa110/arm/ \ 3src-perf := $(srctree)/tools/perf
5 -e s/s390x/s390/ -e s/parisc64/parisc/ \ 4endif
6 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
7 -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )
8NO_PERF_REGS := 1
9CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
10 5
11# Additional ARCH settings for x86 6ifeq ($(obj-perf),)
12ifeq ($(ARCH),i386) 7obj-perf := $(OUTPUT)
13 override ARCH := x86
14 NO_PERF_REGS := 0
15 LIBUNWIND_LIBS = -lunwind -lunwind-x86
16endif 8endif
17 9
18ifeq ($(ARCH),x86_64) 10ifneq ($(obj-perf),)
19 override ARCH := x86 11obj-perf := $(abspath $(obj-perf))/
20 IS_X86_64 := 0 12endif
21 ifeq (, $(findstring m32,$(CFLAGS))) 13
22 IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1) 14LIB_INCLUDE := $(srctree)/tools/lib/
23 endif 15CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
16
17include $(src-perf)/config/Makefile.arch
18
19NO_PERF_REGS := 1
20
21# Additional ARCH settings for x86
22ifeq ($(ARCH),x86)
24 ifeq (${IS_X86_64}, 1) 23 ifeq (${IS_X86_64}, 1)
25 RAW_ARCH := x86_64
26 CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT 24 CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
27 ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S 25 ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
28 LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 26 LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
@@ -55,29 +53,12 @@ else
55 FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS) 53 FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS)
56 FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS) 54 FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS)
57 FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS) 55 FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS)
58 # and the flags for the test-all case
59 FEATURE_CHECK_CFLAGS-all += $(LIBUNWIND_CFLAGS)
60 FEATURE_CHECK_LDFLAGS-all += $(LIBUNWIND_LDFLAGS)
61endif 56endif
62 57
63ifeq ($(NO_PERF_REGS),0) 58ifeq ($(NO_PERF_REGS),0)
64 CFLAGS += -DHAVE_PERF_REGS_SUPPORT 59 CFLAGS += -DHAVE_PERF_REGS_SUPPORT
65endif 60endif
66 61
67ifeq ($(src-perf),)
68src-perf := $(srctree)/tools/perf
69endif
70
71ifeq ($(obj-perf),)
72obj-perf := $(OUTPUT)
73endif
74
75ifneq ($(obj-perf),)
76obj-perf := $(abspath $(obj-perf))/
77endif
78
79LIB_INCLUDE := $(srctree)/tools/lib/
80
81# include ARCH specific config 62# include ARCH specific config
82-include $(src-perf)/arch/$(ARCH)/Makefile 63-include $(src-perf)/arch/$(ARCH)/Makefile
83 64
@@ -168,6 +149,17 @@ CORE_FEATURE_TESTS = \
168 stackprotector-all \ 149 stackprotector-all \
169 timerfd 150 timerfd
170 151
152# Set FEATURE_CHECK_(C|LD)FLAGS-all for all CORE_FEATURE_TESTS features.
153# If in the future we need per-feature checks/flags for features not
154# mentioned in this list we need to refactor this ;-).
155set_test_all_flags = $(eval $(set_test_all_flags_code))
156define set_test_all_flags_code
157 FEATURE_CHECK_CFLAGS-all += $(FEATURE_CHECK_CFLAGS-$(1))
158 FEATURE_CHECK_LDFLAGS-all += $(FEATURE_CHECK_LDFLAGS-$(1))
159endef
160
161$(foreach feat,$(CORE_FEATURE_TESTS),$(call set_test_all_flags,$(feat)))
162
171# 163#
172# So here we detect whether test-all was rebuilt, to be able 164# So here we detect whether test-all was rebuilt, to be able
173# to skip the print-out of the long features list if the file 165# to skip the print-out of the long features list if the file
@@ -240,6 +232,7 @@ endif
240 232
241CFLAGS += -I$(src-perf)/util/include 233CFLAGS += -I$(src-perf)/util/include
242CFLAGS += -I$(src-perf)/arch/$(ARCH)/include 234CFLAGS += -I$(src-perf)/arch/$(ARCH)/include
235CFLAGS += -I$(srctree)/tools/include/
243CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi 236CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi
244CFLAGS += -I$(srctree)/arch/$(ARCH)/include 237CFLAGS += -I$(srctree)/arch/$(ARCH)/include
245CFLAGS += -I$(srctree)/include/uapi 238CFLAGS += -I$(srctree)/include/uapi
diff --git a/tools/perf/config/Makefile.arch b/tools/perf/config/Makefile.arch
new file mode 100644
index 000000000000..fef8ae922800
--- /dev/null
+++ b/tools/perf/config/Makefile.arch
@@ -0,0 +1,22 @@
1
2uname_M := $(shell uname -m 2>/dev/null || echo not)
3
4ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
5 -e s/arm.*/arm/ -e s/sa110/arm/ \
6 -e s/s390x/s390/ -e s/parisc64/parisc/ \
7 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
8 -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )
9
10# Additional ARCH settings for x86
11ifeq ($(ARCH),i386)
12 override ARCH := x86
13endif
14
15ifeq ($(ARCH),x86_64)
16 override ARCH := x86
17 IS_X86_64 := 0
18 ifeq (, $(findstring m32,$(CFLAGS)))
19 IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1)
20 RAW_ARCH := x86_64
21 endif
22endif
diff --git a/tools/perf/config/feature-checks/test-volatile-register-var.c b/tools/perf/config/feature-checks/test-volatile-register-var.c
deleted file mode 100644
index c9f398d87868..000000000000
--- a/tools/perf/config/feature-checks/test-volatile-register-var.c
+++ /dev/null
@@ -1,6 +0,0 @@
1#include <stdio.h>
2
3int main(void)
4{
5 return puts("hi");
6}
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index b1cc84b01d5b..af1ce6e14a93 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -269,6 +269,7 @@ struct record_opts {
269 u64 user_interval; 269 u64 user_interval;
270 u16 stack_dump_size; 270 u16 stack_dump_size;
271 bool sample_transaction; 271 bool sample_transaction;
272 unsigned initial_delay;
272}; 273};
273 274
274#endif 275#endif
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
index 4248d1e96848..653a8fe2db95 100644
--- a/tools/perf/tests/code-reading.c
+++ b/tools/perf/tests/code-reading.c
@@ -540,14 +540,11 @@ static int do_test_code_reading(bool try_kcore)
540 err = TEST_CODE_READING_OK; 540 err = TEST_CODE_READING_OK;
541out_err: 541out_err:
542 if (evlist) { 542 if (evlist) {
543 perf_evlist__munmap(evlist);
544 perf_evlist__close(evlist);
545 perf_evlist__delete(evlist); 543 perf_evlist__delete(evlist);
546 } 544 } else {
547 if (cpus)
548 cpu_map__delete(cpus); 545 cpu_map__delete(cpus);
549 if (threads)
550 thread_map__delete(threads); 546 thread_map__delete(threads);
547 }
551 machines__destroy_kernel_maps(&machines); 548 machines__destroy_kernel_maps(&machines);
552 machine__delete_threads(machine); 549 machine__delete_threads(machine);
553 machines__exit(&machines); 550 machines__exit(&machines);
diff --git a/tools/perf/tests/evsel-roundtrip-name.c b/tools/perf/tests/evsel-roundtrip-name.c
index 0197bda9c461..465cdbc345cf 100644
--- a/tools/perf/tests/evsel-roundtrip-name.c
+++ b/tools/perf/tests/evsel-roundtrip-name.c
@@ -79,7 +79,7 @@ static int __perf_evsel__name_array_test(const char *names[], int nr_names)
79 } 79 }
80 80
81 err = 0; 81 err = 0;
82 list_for_each_entry(evsel, &evlist->entries, node) { 82 evlist__for_each(evlist, evsel) {
83 if (strcmp(perf_evsel__name(evsel), names[evsel->idx])) { 83 if (strcmp(perf_evsel__name(evsel), names[evsel->idx])) {
84 --err; 84 --err;
85 pr_debug("%s != %s\n", perf_evsel__name(evsel), names[evsel->idx]); 85 pr_debug("%s != %s\n", perf_evsel__name(evsel), names[evsel->idx]);
diff --git a/tools/perf/tests/hists_link.c b/tools/perf/tests/hists_link.c
index 173bf42cc03e..2b6519e0e36f 100644
--- a/tools/perf/tests/hists_link.c
+++ b/tools/perf/tests/hists_link.c
@@ -208,7 +208,7 @@ static int add_hist_entries(struct perf_evlist *evlist, struct machine *machine)
208 * However the second evsel also has a collapsed entry for 208 * However the second evsel also has a collapsed entry for
209 * "bash [libc] malloc" so total 9 entries will be in the tree. 209 * "bash [libc] malloc" so total 9 entries will be in the tree.
210 */ 210 */
211 list_for_each_entry(evsel, &evlist->entries, node) { 211 evlist__for_each(evlist, evsel) {
212 for (k = 0; k < ARRAY_SIZE(fake_common_samples); k++) { 212 for (k = 0; k < ARRAY_SIZE(fake_common_samples); k++) {
213 const union perf_event event = { 213 const union perf_event event = {
214 .header = { 214 .header = {
@@ -466,7 +466,7 @@ int test__hists_link(void)
466 if (err < 0) 466 if (err < 0)
467 goto out; 467 goto out;
468 468
469 list_for_each_entry(evsel, &evlist->entries, node) { 469 evlist__for_each(evlist, evsel) {
470 hists__collapse_resort(&evsel->hists, NULL); 470 hists__collapse_resort(&evsel->hists, NULL);
471 471
472 if (verbose > 2) 472 if (verbose > 2)
diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-tracking.c
index 27eb75142b88..497957f269d8 100644
--- a/tools/perf/tests/keep-tracking.c
+++ b/tools/perf/tests/keep-tracking.c
@@ -142,14 +142,11 @@ int test__keep_tracking(void)
142out_err: 142out_err:
143 if (evlist) { 143 if (evlist) {
144 perf_evlist__disable(evlist); 144 perf_evlist__disable(evlist);
145 perf_evlist__munmap(evlist);
146 perf_evlist__close(evlist);
147 perf_evlist__delete(evlist); 145 perf_evlist__delete(evlist);
148 } 146 } else {
149 if (cpus)
150 cpu_map__delete(cpus); 147 cpu_map__delete(cpus);
151 if (threads)
152 thread_map__delete(threads); 148 thread_map__delete(threads);
149 }
153 150
154 return err; 151 return err;
155} 152}
diff --git a/tools/perf/tests/make b/tools/perf/tests/make
index f641c35f2321..00544b8b644b 100644
--- a/tools/perf/tests/make
+++ b/tools/perf/tests/make
@@ -1,6 +1,16 @@
1PERF := . 1PERF := .
2MK := Makefile 2MK := Makefile
3 3
4include config/Makefile.arch
5
6# FIXME looks like x86 is the only arch running tests ;-)
7# we need some IS_(32/64) flag to make this generic
8ifeq ($(IS_X86_64),1)
9lib = lib64
10else
11lib = lib
12endif
13
4has = $(shell which $1 2>/dev/null) 14has = $(shell which $1 2>/dev/null)
5 15
6# standard single make variable specified 16# standard single make variable specified
@@ -118,16 +128,16 @@ installed_files_bin := bin/perf
118installed_files_bin += etc/bash_completion.d/perf 128installed_files_bin += etc/bash_completion.d/perf
119installed_files_bin += libexec/perf-core/perf-archive 129installed_files_bin += libexec/perf-core/perf-archive
120 130
121installed_files_plugins := lib64/traceevent/plugins/plugin_cfg80211.so 131installed_files_plugins := $(lib)/traceevent/plugins/plugin_cfg80211.so
122installed_files_plugins += lib64/traceevent/plugins/plugin_scsi.so 132installed_files_plugins += $(lib)/traceevent/plugins/plugin_scsi.so
123installed_files_plugins += lib64/traceevent/plugins/plugin_xen.so 133installed_files_plugins += $(lib)/traceevent/plugins/plugin_xen.so
124installed_files_plugins += lib64/traceevent/plugins/plugin_function.so 134installed_files_plugins += $(lib)/traceevent/plugins/plugin_function.so
125installed_files_plugins += lib64/traceevent/plugins/plugin_sched_switch.so 135installed_files_plugins += $(lib)/traceevent/plugins/plugin_sched_switch.so
126installed_files_plugins += lib64/traceevent/plugins/plugin_mac80211.so 136installed_files_plugins += $(lib)/traceevent/plugins/plugin_mac80211.so
127installed_files_plugins += lib64/traceevent/plugins/plugin_kvm.so 137installed_files_plugins += $(lib)/traceevent/plugins/plugin_kvm.so
128installed_files_plugins += lib64/traceevent/plugins/plugin_kmem.so 138installed_files_plugins += $(lib)/traceevent/plugins/plugin_kmem.so
129installed_files_plugins += lib64/traceevent/plugins/plugin_hrtimer.so 139installed_files_plugins += $(lib)/traceevent/plugins/plugin_hrtimer.so
130installed_files_plugins += lib64/traceevent/plugins/plugin_jbd2.so 140installed_files_plugins += $(lib)/traceevent/plugins/plugin_jbd2.so
131 141
132installed_files_all := $(installed_files_bin) 142installed_files_all := $(installed_files_bin)
133installed_files_all += $(installed_files_plugins) 143installed_files_all += $(installed_files_plugins)
@@ -206,10 +216,16 @@ $(run_O):
206 rm -rf $$TMP_O \ 216 rm -rf $$TMP_O \
207 rm -rf $$TMP_DEST 217 rm -rf $$TMP_DEST
208 218
209all: $(run) $(run_O) 219tarpkg:
220 @cmd="$(PERF)/tests/perf-targz-src-pkg $(PERF)"; \
221 echo "- $@: $$cmd" && echo $$cmd > $@ && \
222 ( eval $$cmd ) >> $@ 2>&1
223
224
225all: $(run) $(run_O) tarpkg
210 @echo OK 226 @echo OK
211 227
212out: $(run_O) 228out: $(run_O)
213 @echo OK 229 @echo OK
214 230
215.PHONY: all $(run) $(run_O) clean 231.PHONY: all $(run) $(run_O) tarpkg clean
diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c
index d64ab79c6d35..142263492f6f 100644
--- a/tools/perf/tests/mmap-basic.c
+++ b/tools/perf/tests/mmap-basic.c
@@ -68,7 +68,7 @@ int test__basic_mmap(void)
68 evsels[i] = perf_evsel__newtp("syscalls", name); 68 evsels[i] = perf_evsel__newtp("syscalls", name);
69 if (evsels[i] == NULL) { 69 if (evsels[i] == NULL) {
70 pr_debug("perf_evsel__new\n"); 70 pr_debug("perf_evsel__new\n");
71 goto out_free_evlist; 71 goto out_delete_evlist;
72 } 72 }
73 73
74 evsels[i]->attr.wakeup_events = 1; 74 evsels[i]->attr.wakeup_events = 1;
@@ -80,7 +80,7 @@ int test__basic_mmap(void)
80 pr_debug("failed to open counter: %s, " 80 pr_debug("failed to open counter: %s, "
81 "tweak /proc/sys/kernel/perf_event_paranoid?\n", 81 "tweak /proc/sys/kernel/perf_event_paranoid?\n",
82 strerror(errno)); 82 strerror(errno));
83 goto out_close_fd; 83 goto out_delete_evlist;
84 } 84 }
85 85
86 nr_events[i] = 0; 86 nr_events[i] = 0;
@@ -90,7 +90,7 @@ int test__basic_mmap(void)
90 if (perf_evlist__mmap(evlist, 128, true) < 0) { 90 if (perf_evlist__mmap(evlist, 128, true) < 0) {
91 pr_debug("failed to mmap events: %d (%s)\n", errno, 91 pr_debug("failed to mmap events: %d (%s)\n", errno,
92 strerror(errno)); 92 strerror(errno));
93 goto out_close_fd; 93 goto out_delete_evlist;
94 } 94 }
95 95
96 for (i = 0; i < nsyscalls; ++i) 96 for (i = 0; i < nsyscalls; ++i)
@@ -105,13 +105,13 @@ int test__basic_mmap(void)
105 if (event->header.type != PERF_RECORD_SAMPLE) { 105 if (event->header.type != PERF_RECORD_SAMPLE) {
106 pr_debug("unexpected %s event\n", 106 pr_debug("unexpected %s event\n",
107 perf_event__name(event->header.type)); 107 perf_event__name(event->header.type));
108 goto out_munmap; 108 goto out_delete_evlist;
109 } 109 }
110 110
111 err = perf_evlist__parse_sample(evlist, event, &sample); 111 err = perf_evlist__parse_sample(evlist, event, &sample);
112 if (err) { 112 if (err) {
113 pr_err("Can't parse sample, err = %d\n", err); 113 pr_err("Can't parse sample, err = %d\n", err);
114 goto out_munmap; 114 goto out_delete_evlist;
115 } 115 }
116 116
117 err = -1; 117 err = -1;
@@ -119,30 +119,27 @@ int test__basic_mmap(void)
119 if (evsel == NULL) { 119 if (evsel == NULL) {
120 pr_debug("event with id %" PRIu64 120 pr_debug("event with id %" PRIu64
121 " doesn't map to an evsel\n", sample.id); 121 " doesn't map to an evsel\n", sample.id);
122 goto out_munmap; 122 goto out_delete_evlist;
123 } 123 }
124 nr_events[evsel->idx]++; 124 nr_events[evsel->idx]++;
125 perf_evlist__mmap_consume(evlist, 0); 125 perf_evlist__mmap_consume(evlist, 0);
126 } 126 }
127 127
128 err = 0; 128 err = 0;
129 list_for_each_entry(evsel, &evlist->entries, node) { 129 evlist__for_each(evlist, evsel) {
130 if (nr_events[evsel->idx] != expected_nr_events[evsel->idx]) { 130 if (nr_events[evsel->idx] != expected_nr_events[evsel->idx]) {
131 pr_debug("expected %d %s events, got %d\n", 131 pr_debug("expected %d %s events, got %d\n",
132 expected_nr_events[evsel->idx], 132 expected_nr_events[evsel->idx],
133 perf_evsel__name(evsel), nr_events[evsel->idx]); 133 perf_evsel__name(evsel), nr_events[evsel->idx]);
134 err = -1; 134 err = -1;
135 goto out_munmap; 135 goto out_delete_evlist;
136 } 136 }
137 } 137 }
138 138
139out_munmap: 139out_delete_evlist:
140 perf_evlist__munmap(evlist);
141out_close_fd:
142 for (i = 0; i < nsyscalls; ++i)
143 perf_evsel__close_fd(evsels[i], 1, threads->nr);
144out_free_evlist:
145 perf_evlist__delete(evlist); 140 perf_evlist__delete(evlist);
141 cpus = NULL;
142 threads = NULL;
146out_free_cpus: 143out_free_cpus:
147 cpu_map__delete(cpus); 144 cpu_map__delete(cpus);
148out_free_threads: 145out_free_threads:
diff --git a/tools/perf/tests/open-syscall-tp-fields.c b/tools/perf/tests/open-syscall-tp-fields.c
index 774620a5aecb..5a016f66f5d2 100644
--- a/tools/perf/tests/open-syscall-tp-fields.c
+++ b/tools/perf/tests/open-syscall-tp-fields.c
@@ -48,13 +48,13 @@ int test__syscall_open_tp_fields(void)
48 err = perf_evlist__open(evlist); 48 err = perf_evlist__open(evlist);
49 if (err < 0) { 49 if (err < 0) {
50 pr_debug("perf_evlist__open: %s\n", strerror(errno)); 50 pr_debug("perf_evlist__open: %s\n", strerror(errno));
51 goto out_delete_maps; 51 goto out_delete_evlist;
52 } 52 }
53 53
54 err = perf_evlist__mmap(evlist, UINT_MAX, false); 54 err = perf_evlist__mmap(evlist, UINT_MAX, false);
55 if (err < 0) { 55 if (err < 0) {
56 pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); 56 pr_debug("perf_evlist__mmap: %s\n", strerror(errno));
57 goto out_close_evlist; 57 goto out_delete_evlist;
58 } 58 }
59 59
60 perf_evlist__enable(evlist); 60 perf_evlist__enable(evlist);
@@ -85,7 +85,7 @@ int test__syscall_open_tp_fields(void)
85 err = perf_evsel__parse_sample(evsel, event, &sample); 85 err = perf_evsel__parse_sample(evsel, event, &sample);
86 if (err) { 86 if (err) {
87 pr_err("Can't parse sample, err = %d\n", err); 87 pr_err("Can't parse sample, err = %d\n", err);
88 goto out_munmap; 88 goto out_delete_evlist;
89 } 89 }
90 90
91 tp_flags = perf_evsel__intval(evsel, &sample, "flags"); 91 tp_flags = perf_evsel__intval(evsel, &sample, "flags");
@@ -93,7 +93,7 @@ int test__syscall_open_tp_fields(void)
93 if (flags != tp_flags) { 93 if (flags != tp_flags) {
94 pr_debug("%s: Expected flags=%#x, got %#x\n", 94 pr_debug("%s: Expected flags=%#x, got %#x\n",
95 __func__, flags, tp_flags); 95 __func__, flags, tp_flags);
96 goto out_munmap; 96 goto out_delete_evlist;
97 } 97 }
98 98
99 goto out_ok; 99 goto out_ok;
@@ -105,17 +105,11 @@ int test__syscall_open_tp_fields(void)
105 105
106 if (++nr_polls > 5) { 106 if (++nr_polls > 5) {
107 pr_debug("%s: no events!\n", __func__); 107 pr_debug("%s: no events!\n", __func__);
108 goto out_munmap; 108 goto out_delete_evlist;
109 } 109 }
110 } 110 }
111out_ok: 111out_ok:
112 err = 0; 112 err = 0;
113out_munmap:
114 perf_evlist__munmap(evlist);
115out_close_evlist:
116 perf_evlist__close(evlist);
117out_delete_maps:
118 perf_evlist__delete_maps(evlist);
119out_delete_evlist: 113out_delete_evlist:
120 perf_evlist__delete(evlist); 114 perf_evlist__delete(evlist);
121out: 115out:
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index e4ce8aed29d3..4db0ae617d70 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -30,7 +30,7 @@ static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)
30 TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1); 30 TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
31 TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups); 31 TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
32 32
33 list_for_each_entry(evsel, &evlist->entries, node) { 33 evlist__for_each(evlist, evsel) {
34 TEST_ASSERT_VAL("wrong type", 34 TEST_ASSERT_VAL("wrong type",
35 PERF_TYPE_TRACEPOINT == evsel->attr.type); 35 PERF_TYPE_TRACEPOINT == evsel->attr.type);
36 TEST_ASSERT_VAL("wrong sample_type", 36 TEST_ASSERT_VAL("wrong sample_type",
@@ -201,7 +201,7 @@ test__checkevent_tracepoint_multi_modifier(struct perf_evlist *evlist)
201 201
202 TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1); 202 TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
203 203
204 list_for_each_entry(evsel, &evlist->entries, node) { 204 evlist__for_each(evlist, evsel) {
205 TEST_ASSERT_VAL("wrong exclude_user", 205 TEST_ASSERT_VAL("wrong exclude_user",
206 !evsel->attr.exclude_user); 206 !evsel->attr.exclude_user);
207 TEST_ASSERT_VAL("wrong exclude_kernel", 207 TEST_ASSERT_VAL("wrong exclude_kernel",
@@ -1385,10 +1385,10 @@ static int test_event(struct evlist_test *e)
1385 if (ret) { 1385 if (ret) {
1386 pr_debug("failed to parse event '%s', err %d\n", 1386 pr_debug("failed to parse event '%s', err %d\n",
1387 e->name, ret); 1387 e->name, ret);
1388 return ret; 1388 } else {
1389 ret = e->check(evlist);
1389 } 1390 }
1390 1391
1391 ret = e->check(evlist);
1392 perf_evlist__delete(evlist); 1392 perf_evlist__delete(evlist);
1393 1393
1394 return ret; 1394 return ret;
diff --git a/tools/perf/tests/perf-record.c b/tools/perf/tests/perf-record.c
index eeba562920e9..39cc7c3c0d0c 100644
--- a/tools/perf/tests/perf-record.c
+++ b/tools/perf/tests/perf-record.c
@@ -83,11 +83,10 @@ int test__PERF_RECORD(void)
83 * so that we have time to open the evlist (calling sys_perf_event_open 83 * so that we have time to open the evlist (calling sys_perf_event_open
84 * on all the fds) and then mmap them. 84 * on all the fds) and then mmap them.
85 */ 85 */
86 err = perf_evlist__prepare_workload(evlist, &opts.target, argv, 86 err = perf_evlist__prepare_workload(evlist, &opts.target, argv, false, NULL);
87 false, false);
88 if (err < 0) { 87 if (err < 0) {
89 pr_debug("Couldn't run the workload!\n"); 88 pr_debug("Couldn't run the workload!\n");
90 goto out_delete_maps; 89 goto out_delete_evlist;
91 } 90 }
92 91
93 /* 92 /*
@@ -102,7 +101,7 @@ int test__PERF_RECORD(void)
102 err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask); 101 err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
103 if (err < 0) { 102 if (err < 0) {
104 pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno)); 103 pr_debug("sched__get_first_possible_cpu: %s\n", strerror(errno));
105 goto out_delete_maps; 104 goto out_delete_evlist;
106 } 105 }
107 106
108 cpu = err; 107 cpu = err;
@@ -112,7 +111,7 @@ int test__PERF_RECORD(void)
112 */ 111 */
113 if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) { 112 if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) {
114 pr_debug("sched_setaffinity: %s\n", strerror(errno)); 113 pr_debug("sched_setaffinity: %s\n", strerror(errno));
115 goto out_delete_maps; 114 goto out_delete_evlist;
116 } 115 }
117 116
118 /* 117 /*
@@ -122,7 +121,7 @@ int test__PERF_RECORD(void)
122 err = perf_evlist__open(evlist); 121 err = perf_evlist__open(evlist);
123 if (err < 0) { 122 if (err < 0) {
124 pr_debug("perf_evlist__open: %s\n", strerror(errno)); 123 pr_debug("perf_evlist__open: %s\n", strerror(errno));
125 goto out_delete_maps; 124 goto out_delete_evlist;
126 } 125 }
127 126
128 /* 127 /*
@@ -133,7 +132,7 @@ int test__PERF_RECORD(void)
133 err = perf_evlist__mmap(evlist, opts.mmap_pages, false); 132 err = perf_evlist__mmap(evlist, opts.mmap_pages, false);
134 if (err < 0) { 133 if (err < 0) {
135 pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); 134 pr_debug("perf_evlist__mmap: %s\n", strerror(errno));
136 goto out_close_evlist; 135 goto out_delete_evlist;
137 } 136 }
138 137
139 /* 138 /*
@@ -166,7 +165,7 @@ int test__PERF_RECORD(void)
166 if (verbose) 165 if (verbose)
167 perf_event__fprintf(event, stderr); 166 perf_event__fprintf(event, stderr);
168 pr_debug("Couldn't parse sample\n"); 167 pr_debug("Couldn't parse sample\n");
169 goto out_err; 168 goto out_delete_evlist;
170 } 169 }
171 170
172 if (verbose) { 171 if (verbose) {
@@ -303,12 +302,6 @@ found_exit:
303 pr_debug("PERF_RECORD_MMAP for %s missing!\n", "[vdso]"); 302 pr_debug("PERF_RECORD_MMAP for %s missing!\n", "[vdso]");
304 ++errs; 303 ++errs;
305 } 304 }
306out_err:
307 perf_evlist__munmap(evlist);
308out_close_evlist:
309 perf_evlist__close(evlist);
310out_delete_maps:
311 perf_evlist__delete_maps(evlist);
312out_delete_evlist: 305out_delete_evlist:
313 perf_evlist__delete(evlist); 306 perf_evlist__delete(evlist);
314out: 307out:
diff --git a/tools/perf/tests/perf-targz-src-pkg b/tools/perf/tests/perf-targz-src-pkg
new file mode 100755
index 000000000000..238aa3927c71
--- /dev/null
+++ b/tools/perf/tests/perf-targz-src-pkg
@@ -0,0 +1,21 @@
1#!/bin/sh
2# Test one of the main kernel Makefile targets to generate a perf sources tarball
3# suitable for build outside the full kernel sources.
4#
5# This is to test that the tools/perf/MANIFEST file lists all the files needed to
6# be in such tarball, which sometimes gets broken when we move files around,
7# like when we made some files that were in tools/perf/ available to other tools/
8# codebases by moving it to tools/include/, etc.
9
10PERF=$1
11cd ${PERF}/../..
12make perf-targz-src-pkg > /dev/null
13TARBALL=$(ls -rt perf-*.tar.gz)
14TMP_DEST=$(mktemp -d)
15tar xf ${TARBALL} -C $TMP_DEST
16rm -f ${TARBALL}
17cd - > /dev/null
18make -C $TMP_DEST/perf*/tools/perf > /dev/null 2>&1
19RC=$?
20rm -rf ${TMP_DEST}
21exit $RC
diff --git a/tools/perf/tests/perf-time-to-tsc.c b/tools/perf/tests/perf-time-to-tsc.c
index c6398b90e897..47146d388dbf 100644
--- a/tools/perf/tests/perf-time-to-tsc.c
+++ b/tools/perf/tests/perf-time-to-tsc.c
@@ -166,14 +166,8 @@ next_event:
166out_err: 166out_err:
167 if (evlist) { 167 if (evlist) {
168 perf_evlist__disable(evlist); 168 perf_evlist__disable(evlist);
169 perf_evlist__munmap(evlist);
170 perf_evlist__close(evlist);
171 perf_evlist__delete(evlist); 169 perf_evlist__delete(evlist);
172 } 170 }
173 if (cpus)
174 cpu_map__delete(cpus);
175 if (threads)
176 thread_map__delete(threads);
177 171
178 return err; 172 return err;
179} 173}
diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c
index 6664a7cd828c..983d6b8562a8 100644
--- a/tools/perf/tests/sw-clock.c
+++ b/tools/perf/tests/sw-clock.c
@@ -45,7 +45,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
45 evsel = perf_evsel__new(&attr); 45 evsel = perf_evsel__new(&attr);
46 if (evsel == NULL) { 46 if (evsel == NULL) {
47 pr_debug("perf_evsel__new\n"); 47 pr_debug("perf_evsel__new\n");
48 goto out_free_evlist; 48 goto out_delete_evlist;
49 } 49 }
50 perf_evlist__add(evlist, evsel); 50 perf_evlist__add(evlist, evsel);
51 51
@@ -54,7 +54,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
54 if (!evlist->cpus || !evlist->threads) { 54 if (!evlist->cpus || !evlist->threads) {
55 err = -ENOMEM; 55 err = -ENOMEM;
56 pr_debug("Not enough memory to create thread/cpu maps\n"); 56 pr_debug("Not enough memory to create thread/cpu maps\n");
57 goto out_delete_maps; 57 goto out_delete_evlist;
58 } 58 }
59 59
60 if (perf_evlist__open(evlist)) { 60 if (perf_evlist__open(evlist)) {
@@ -63,14 +63,14 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
63 err = -errno; 63 err = -errno;
64 pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n", 64 pr_debug("Couldn't open evlist: %s\nHint: check %s, using %" PRIu64 " in this test.\n",
65 strerror(errno), knob, (u64)attr.sample_freq); 65 strerror(errno), knob, (u64)attr.sample_freq);
66 goto out_delete_maps; 66 goto out_delete_evlist;
67 } 67 }
68 68
69 err = perf_evlist__mmap(evlist, 128, true); 69 err = perf_evlist__mmap(evlist, 128, true);
70 if (err < 0) { 70 if (err < 0) {
71 pr_debug("failed to mmap event: %d (%s)\n", errno, 71 pr_debug("failed to mmap event: %d (%s)\n", errno,
72 strerror(errno)); 72 strerror(errno));
73 goto out_close_evlist; 73 goto out_delete_evlist;
74 } 74 }
75 75
76 perf_evlist__enable(evlist); 76 perf_evlist__enable(evlist);
@@ -90,7 +90,7 @@ static int __test__sw_clock_freq(enum perf_sw_ids clock_id)
90 err = perf_evlist__parse_sample(evlist, event, &sample); 90 err = perf_evlist__parse_sample(evlist, event, &sample);
91 if (err < 0) { 91 if (err < 0) {
92 pr_debug("Error during parse sample\n"); 92 pr_debug("Error during parse sample\n");
93 goto out_unmap_evlist; 93 goto out_delete_evlist;
94 } 94 }
95 95
96 total_periods += sample.period; 96 total_periods += sample.period;
@@ -105,13 +105,7 @@ next_event:
105 err = -1; 105 err = -1;
106 } 106 }
107 107
108out_unmap_evlist: 108out_delete_evlist:
109 perf_evlist__munmap(evlist);
110out_close_evlist:
111 perf_evlist__close(evlist);
112out_delete_maps:
113 perf_evlist__delete_maps(evlist);
114out_free_evlist:
115 perf_evlist__delete(evlist); 109 perf_evlist__delete(evlist);
116 return err; 110 return err;
117} 111}
diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c
index d09ab579119e..5ff3db318f12 100644
--- a/tools/perf/tests/task-exit.c
+++ b/tools/perf/tests/task-exit.c
@@ -9,12 +9,21 @@
9static int exited; 9static int exited;
10static int nr_exit; 10static int nr_exit;
11 11
12static void sig_handler(int sig) 12static void sig_handler(int sig __maybe_unused)
13{ 13{
14 exited = 1; 14 exited = 1;
15}
15 16
16 if (sig == SIGUSR1) 17/*
17 nr_exit = -1; 18 * perf_evlist__prepare_workload will send a SIGUSR1 if the fork fails, since
19 * we asked by setting its exec_error to this handler.
20 */
21static void workload_exec_failed_signal(int signo __maybe_unused,
22 siginfo_t *info __maybe_unused,
23 void *ucontext __maybe_unused)
24{
25 exited = 1;
26 nr_exit = -1;
18} 27}
19 28
20/* 29/*
@@ -35,7 +44,6 @@ int test__task_exit(void)
35 const char *argv[] = { "true", NULL }; 44 const char *argv[] = { "true", NULL };
36 45
37 signal(SIGCHLD, sig_handler); 46 signal(SIGCHLD, sig_handler);
38 signal(SIGUSR1, sig_handler);
39 47
40 evlist = perf_evlist__new_default(); 48 evlist = perf_evlist__new_default();
41 if (evlist == NULL) { 49 if (evlist == NULL) {
@@ -54,13 +62,14 @@ int test__task_exit(void)
54 if (!evlist->cpus || !evlist->threads) { 62 if (!evlist->cpus || !evlist->threads) {
55 err = -ENOMEM; 63 err = -ENOMEM;
56 pr_debug("Not enough memory to create thread/cpu maps\n"); 64 pr_debug("Not enough memory to create thread/cpu maps\n");
57 goto out_delete_maps; 65 goto out_delete_evlist;
58 } 66 }
59 67
60 err = perf_evlist__prepare_workload(evlist, &target, argv, false, true); 68 err = perf_evlist__prepare_workload(evlist, &target, argv, false,
69 workload_exec_failed_signal);
61 if (err < 0) { 70 if (err < 0) {
62 pr_debug("Couldn't run the workload!\n"); 71 pr_debug("Couldn't run the workload!\n");
63 goto out_delete_maps; 72 goto out_delete_evlist;
64 } 73 }
65 74
66 evsel = perf_evlist__first(evlist); 75 evsel = perf_evlist__first(evlist);
@@ -74,13 +83,13 @@ int test__task_exit(void)
74 err = perf_evlist__open(evlist); 83 err = perf_evlist__open(evlist);
75 if (err < 0) { 84 if (err < 0) {
76 pr_debug("Couldn't open the evlist: %s\n", strerror(-err)); 85 pr_debug("Couldn't open the evlist: %s\n", strerror(-err));
77 goto out_delete_maps; 86 goto out_delete_evlist;
78 } 87 }
79 88
80 if (perf_evlist__mmap(evlist, 128, true) < 0) { 89 if (perf_evlist__mmap(evlist, 128, true) < 0) {
81 pr_debug("failed to mmap events: %d (%s)\n", errno, 90 pr_debug("failed to mmap events: %d (%s)\n", errno,
82 strerror(errno)); 91 strerror(errno));
83 goto out_close_evlist; 92 goto out_delete_evlist;
84 } 93 }
85 94
86 perf_evlist__start_workload(evlist); 95 perf_evlist__start_workload(evlist);
@@ -103,11 +112,7 @@ retry:
103 err = -1; 112 err = -1;
104 } 113 }
105 114
106 perf_evlist__munmap(evlist); 115out_delete_evlist:
107out_close_evlist:
108 perf_evlist__close(evlist);
109out_delete_maps:
110 perf_evlist__delete_maps(evlist);
111 perf_evlist__delete(evlist); 116 perf_evlist__delete(evlist);
112 return err; 117 return err;
113} 118}
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index a7045ea6d1d5..b720b92eba6e 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -1938,7 +1938,7 @@ static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist,
1938 1938
1939 ui_helpline__push("Press ESC to exit"); 1939 ui_helpline__push("Press ESC to exit");
1940 1940
1941 list_for_each_entry(pos, &evlist->entries, node) { 1941 evlist__for_each(evlist, pos) {
1942 const char *ev_name = perf_evsel__name(pos); 1942 const char *ev_name = perf_evsel__name(pos);
1943 size_t line_len = strlen(ev_name) + 7; 1943 size_t line_len = strlen(ev_name) + 7;
1944 1944
@@ -1970,9 +1970,10 @@ single_entry:
1970 struct perf_evsel *pos; 1970 struct perf_evsel *pos;
1971 1971
1972 nr_entries = 0; 1972 nr_entries = 0;
1973 list_for_each_entry(pos, &evlist->entries, node) 1973 evlist__for_each(evlist, pos) {
1974 if (perf_evsel__is_group_leader(pos)) 1974 if (perf_evsel__is_group_leader(pos))
1975 nr_entries++; 1975 nr_entries++;
1976 }
1976 1977
1977 if (nr_entries == 1) 1978 if (nr_entries == 1)
1978 goto single_entry; 1979 goto single_entry;
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c
index 2ca66cc1160f..5b95c44f3435 100644
--- a/tools/perf/ui/gtk/hists.c
+++ b/tools/perf/ui/gtk/hists.c
@@ -375,7 +375,7 @@ int perf_evlist__gtk_browse_hists(struct perf_evlist *evlist,
375 375
376 gtk_container_add(GTK_CONTAINER(window), vbox); 376 gtk_container_add(GTK_CONTAINER(window), vbox);
377 377
378 list_for_each_entry(pos, &evlist->entries, node) { 378 evlist__for_each(evlist, pos) {
379 struct hists *hists = &pos->hists; 379 struct hists *hists = &pos->hists;
380 const char *evname = perf_evsel__name(pos); 380 const char *evname = perf_evsel__name(pos);
381 GtkWidget *scrolled_window; 381 GtkWidget *scrolled_window;
diff --git a/tools/perf/util/cgroup.c b/tools/perf/util/cgroup.c
index 0922aa4218c2..88f7be399432 100644
--- a/tools/perf/util/cgroup.c
+++ b/tools/perf/util/cgroup.c
@@ -81,7 +81,7 @@ static int add_cgroup(struct perf_evlist *evlist, char *str)
81 /* 81 /*
82 * check if cgrp is already defined, if so we reuse it 82 * check if cgrp is already defined, if so we reuse it
83 */ 83 */
84 list_for_each_entry(counter, &evlist->entries, node) { 84 evlist__for_each(evlist, counter) {
85 cgrp = counter->cgrp; 85 cgrp = counter->cgrp;
86 if (!cgrp) 86 if (!cgrp)
87 continue; 87 continue;
@@ -110,7 +110,7 @@ static int add_cgroup(struct perf_evlist *evlist, char *str)
110 * if add cgroup N, then need to find event N 110 * if add cgroup N, then need to find event N
111 */ 111 */
112 n = 0; 112 n = 0;
113 list_for_each_entry(counter, &evlist->entries, node) { 113 evlist__for_each(evlist, counter) {
114 if (n == nr_cgroups) 114 if (n == nr_cgroups)
115 goto found; 115 goto found;
116 n++; 116 n++;
diff --git a/tools/perf/util/color.c b/tools/perf/util/color.c
index 66e44a5019d5..87b8672eb413 100644
--- a/tools/perf/util/color.c
+++ b/tools/perf/util/color.c
@@ -1,6 +1,7 @@
1#include <linux/kernel.h> 1#include <linux/kernel.h>
2#include "cache.h" 2#include "cache.h"
3#include "color.h" 3#include "color.h"
4#include <math.h>
4 5
5int perf_use_color_default = -1; 6int perf_use_color_default = -1;
6 7
@@ -298,10 +299,10 @@ const char *get_percent_color(double percent)
298 * entries in green - and keep the low overhead places 299 * entries in green - and keep the low overhead places
299 * normal: 300 * normal:
300 */ 301 */
301 if (percent >= MIN_RED) 302 if (fabs(percent) >= MIN_RED)
302 color = PERF_COLOR_RED; 303 color = PERF_COLOR_RED;
303 else { 304 else {
304 if (percent > MIN_GREEN) 305 if (fabs(percent) > MIN_GREEN)
305 color = PERF_COLOR_GREEN; 306 color = PERF_COLOR_GREEN;
306 } 307 }
307 return color; 308 return color;
@@ -318,15 +319,19 @@ int percent_color_fprintf(FILE *fp, const char *fmt, double percent)
318 return r; 319 return r;
319} 320}
320 321
322int value_color_snprintf(char *bf, size_t size, const char *fmt, double value)
323{
324 const char *color = get_percent_color(value);
325 return color_snprintf(bf, size, color, fmt, value);
326}
327
321int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...) 328int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...)
322{ 329{
323 va_list args; 330 va_list args;
324 double percent; 331 double percent;
325 const char *color;
326 332
327 va_start(args, fmt); 333 va_start(args, fmt);
328 percent = va_arg(args, double); 334 percent = va_arg(args, double);
329 va_end(args); 335 va_end(args);
330 color = get_percent_color(percent); 336 return value_color_snprintf(bf, size, fmt, percent);
331 return color_snprintf(bf, size, color, fmt, percent);
332} 337}
diff --git a/tools/perf/util/color.h b/tools/perf/util/color.h
index fced3840e99c..7ff30a62a132 100644
--- a/tools/perf/util/color.h
+++ b/tools/perf/util/color.h
@@ -39,6 +39,7 @@ int color_fprintf(FILE *fp, const char *color, const char *fmt, ...);
39int color_snprintf(char *bf, size_t size, const char *color, const char *fmt, ...); 39int color_snprintf(char *bf, size_t size, const char *color, const char *fmt, ...);
40int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...); 40int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...);
41int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf); 41int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf);
42int value_color_snprintf(char *bf, size_t size, const char *fmt, double value);
42int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...); 43int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...);
43int percent_color_fprintf(FILE *fp, const char *fmt, double percent); 44int percent_color_fprintf(FILE *fp, const char *fmt, double percent);
44const char *get_percent_color(double percent); 45const char *get_percent_color(double percent);
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
index 45a76c69a9ed..1fc1c2f04772 100644
--- a/tools/perf/util/event.c
+++ b/tools/perf/util/event.c
@@ -175,12 +175,12 @@ out:
175 return tgid; 175 return tgid;
176} 176}
177 177
178static int perf_event__synthesize_mmap_events(struct perf_tool *tool, 178int perf_event__synthesize_mmap_events(struct perf_tool *tool,
179 union perf_event *event, 179 union perf_event *event,
180 pid_t pid, pid_t tgid, 180 pid_t pid, pid_t tgid,
181 perf_event__handler_t process, 181 perf_event__handler_t process,
182 struct machine *machine, 182 struct machine *machine,
183 bool mmap_data) 183 bool mmap_data)
184{ 184{
185 char filename[PATH_MAX]; 185 char filename[PATH_MAX];
186 FILE *fp; 186 FILE *fp;
diff --git a/tools/perf/util/event.h b/tools/perf/util/event.h
index 30fec9901e44..faf6e219be21 100644
--- a/tools/perf/util/event.h
+++ b/tools/perf/util/event.h
@@ -266,6 +266,13 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type,
266 const struct perf_sample *sample, 266 const struct perf_sample *sample,
267 bool swapped); 267 bool swapped);
268 268
269int perf_event__synthesize_mmap_events(struct perf_tool *tool,
270 union perf_event *event,
271 pid_t pid, pid_t tgid,
272 perf_event__handler_t process,
273 struct machine *machine,
274 bool mmap_data);
275
269size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); 276size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp);
270size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); 277size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp);
271size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); 278size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp);
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index b08a7ecdcea1..40bd2c04df8a 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -81,7 +81,7 @@ static void perf_evlist__update_id_pos(struct perf_evlist *evlist)
81{ 81{
82 struct perf_evsel *evsel; 82 struct perf_evsel *evsel;
83 83
84 list_for_each_entry(evsel, &evlist->entries, node) 84 evlist__for_each(evlist, evsel)
85 perf_evsel__calc_id_pos(evsel); 85 perf_evsel__calc_id_pos(evsel);
86 86
87 perf_evlist__set_id_pos(evlist); 87 perf_evlist__set_id_pos(evlist);
@@ -91,7 +91,7 @@ static void perf_evlist__purge(struct perf_evlist *evlist)
91{ 91{
92 struct perf_evsel *pos, *n; 92 struct perf_evsel *pos, *n;
93 93
94 list_for_each_entry_safe(pos, n, &evlist->entries, node) { 94 evlist__for_each_safe(evlist, n, pos) {
95 list_del_init(&pos->node); 95 list_del_init(&pos->node);
96 perf_evsel__delete(pos); 96 perf_evsel__delete(pos);
97 } 97 }
@@ -107,6 +107,12 @@ void perf_evlist__exit(struct perf_evlist *evlist)
107 107
108void perf_evlist__delete(struct perf_evlist *evlist) 108void perf_evlist__delete(struct perf_evlist *evlist)
109{ 109{
110 perf_evlist__munmap(evlist);
111 perf_evlist__close(evlist);
112 cpu_map__delete(evlist->cpus);
113 thread_map__delete(evlist->threads);
114 evlist->cpus = NULL;
115 evlist->threads = NULL;
110 perf_evlist__purge(evlist); 116 perf_evlist__purge(evlist);
111 perf_evlist__exit(evlist); 117 perf_evlist__exit(evlist);
112 free(evlist); 118 free(evlist);
@@ -142,7 +148,7 @@ void __perf_evlist__set_leader(struct list_head *list)
142 148
143 leader->nr_members = evsel->idx - leader->idx + 1; 149 leader->nr_members = evsel->idx - leader->idx + 1;
144 150
145 list_for_each_entry(evsel, list, node) { 151 __evlist__for_each(list, evsel) {
146 evsel->leader = leader; 152 evsel->leader = leader;
147 } 153 }
148} 154}
@@ -201,7 +207,7 @@ static int perf_evlist__add_attrs(struct perf_evlist *evlist,
201 return 0; 207 return 0;
202 208
203out_delete_partial_list: 209out_delete_partial_list:
204 list_for_each_entry_safe(evsel, n, &head, node) 210 __evlist__for_each_safe(&head, n, evsel)
205 perf_evsel__delete(evsel); 211 perf_evsel__delete(evsel);
206 return -1; 212 return -1;
207} 213}
@@ -222,7 +228,7 @@ perf_evlist__find_tracepoint_by_id(struct perf_evlist *evlist, int id)
222{ 228{
223 struct perf_evsel *evsel; 229 struct perf_evsel *evsel;
224 230
225 list_for_each_entry(evsel, &evlist->entries, node) { 231 evlist__for_each(evlist, evsel) {
226 if (evsel->attr.type == PERF_TYPE_TRACEPOINT && 232 if (evsel->attr.type == PERF_TYPE_TRACEPOINT &&
227 (int)evsel->attr.config == id) 233 (int)evsel->attr.config == id)
228 return evsel; 234 return evsel;
@@ -237,7 +243,7 @@ perf_evlist__find_tracepoint_by_name(struct perf_evlist *evlist,
237{ 243{
238 struct perf_evsel *evsel; 244 struct perf_evsel *evsel;
239 245
240 list_for_each_entry(evsel, &evlist->entries, node) { 246 evlist__for_each(evlist, evsel) {
241 if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) && 247 if ((evsel->attr.type == PERF_TYPE_TRACEPOINT) &&
242 (strcmp(evsel->name, name) == 0)) 248 (strcmp(evsel->name, name) == 0))
243 return evsel; 249 return evsel;
@@ -267,7 +273,7 @@ void perf_evlist__disable(struct perf_evlist *evlist)
267 int nr_threads = thread_map__nr(evlist->threads); 273 int nr_threads = thread_map__nr(evlist->threads);
268 274
269 for (cpu = 0; cpu < nr_cpus; cpu++) { 275 for (cpu = 0; cpu < nr_cpus; cpu++) {
270 list_for_each_entry(pos, &evlist->entries, node) { 276 evlist__for_each(evlist, pos) {
271 if (!perf_evsel__is_group_leader(pos) || !pos->fd) 277 if (!perf_evsel__is_group_leader(pos) || !pos->fd)
272 continue; 278 continue;
273 for (thread = 0; thread < nr_threads; thread++) 279 for (thread = 0; thread < nr_threads; thread++)
@@ -285,7 +291,7 @@ void perf_evlist__enable(struct perf_evlist *evlist)
285 int nr_threads = thread_map__nr(evlist->threads); 291 int nr_threads = thread_map__nr(evlist->threads);
286 292
287 for (cpu = 0; cpu < nr_cpus; cpu++) { 293 for (cpu = 0; cpu < nr_cpus; cpu++) {
288 list_for_each_entry(pos, &evlist->entries, node) { 294 evlist__for_each(evlist, pos) {
289 if (!perf_evsel__is_group_leader(pos) || !pos->fd) 295 if (!perf_evsel__is_group_leader(pos) || !pos->fd)
290 continue; 296 continue;
291 for (thread = 0; thread < nr_threads; thread++) 297 for (thread = 0; thread < nr_threads; thread++)
@@ -582,6 +588,9 @@ void perf_evlist__munmap(struct perf_evlist *evlist)
582{ 588{
583 int i; 589 int i;
584 590
591 if (evlist->mmap == NULL)
592 return;
593
585 for (i = 0; i < evlist->nr_mmaps; i++) 594 for (i = 0; i < evlist->nr_mmaps; i++)
586 __perf_evlist__munmap(evlist, i); 595 __perf_evlist__munmap(evlist, i);
587 596
@@ -621,7 +630,7 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
621{ 630{
622 struct perf_evsel *evsel; 631 struct perf_evsel *evsel;
623 632
624 list_for_each_entry(evsel, &evlist->entries, node) { 633 evlist__for_each(evlist, evsel) {
625 int fd = FD(evsel, cpu, thread); 634 int fd = FD(evsel, cpu, thread);
626 635
627 if (*output == -1) { 636 if (*output == -1) {
@@ -797,7 +806,7 @@ int perf_evlist__mmap(struct perf_evlist *evlist, unsigned int pages,
797 pr_debug("mmap size %zuB\n", evlist->mmap_len); 806 pr_debug("mmap size %zuB\n", evlist->mmap_len);
798 mask = evlist->mmap_len - page_size - 1; 807 mask = evlist->mmap_len - page_size - 1;
799 808
800 list_for_each_entry(evsel, &evlist->entries, node) { 809 evlist__for_each(evlist, evsel) {
801 if ((evsel->attr.read_format & PERF_FORMAT_ID) && 810 if ((evsel->attr.read_format & PERF_FORMAT_ID) &&
802 evsel->sample_id == NULL && 811 evsel->sample_id == NULL &&
803 perf_evsel__alloc_id(evsel, cpu_map__nr(cpus), threads->nr) < 0) 812 perf_evsel__alloc_id(evsel, cpu_map__nr(cpus), threads->nr) < 0)
@@ -833,14 +842,6 @@ out_delete_threads:
833 return -1; 842 return -1;
834} 843}
835 844
836void perf_evlist__delete_maps(struct perf_evlist *evlist)
837{
838 cpu_map__delete(evlist->cpus);
839 thread_map__delete(evlist->threads);
840 evlist->cpus = NULL;
841 evlist->threads = NULL;
842}
843
844int perf_evlist__apply_filters(struct perf_evlist *evlist) 845int perf_evlist__apply_filters(struct perf_evlist *evlist)
845{ 846{
846 struct perf_evsel *evsel; 847 struct perf_evsel *evsel;
@@ -848,7 +849,7 @@ int perf_evlist__apply_filters(struct perf_evlist *evlist)
848 const int ncpus = cpu_map__nr(evlist->cpus), 849 const int ncpus = cpu_map__nr(evlist->cpus),
849 nthreads = thread_map__nr(evlist->threads); 850 nthreads = thread_map__nr(evlist->threads);
850 851
851 list_for_each_entry(evsel, &evlist->entries, node) { 852 evlist__for_each(evlist, evsel) {
852 if (evsel->filter == NULL) 853 if (evsel->filter == NULL)
853 continue; 854 continue;
854 855
@@ -867,7 +868,7 @@ int perf_evlist__set_filter(struct perf_evlist *evlist, const char *filter)
867 const int ncpus = cpu_map__nr(evlist->cpus), 868 const int ncpus = cpu_map__nr(evlist->cpus),
868 nthreads = thread_map__nr(evlist->threads); 869 nthreads = thread_map__nr(evlist->threads);
869 870
870 list_for_each_entry(evsel, &evlist->entries, node) { 871 evlist__for_each(evlist, evsel) {
871 err = perf_evsel__set_filter(evsel, ncpus, nthreads, filter); 872 err = perf_evsel__set_filter(evsel, ncpus, nthreads, filter);
872 if (err) 873 if (err)
873 break; 874 break;
@@ -886,7 +887,7 @@ bool perf_evlist__valid_sample_type(struct perf_evlist *evlist)
886 if (evlist->id_pos < 0 || evlist->is_pos < 0) 887 if (evlist->id_pos < 0 || evlist->is_pos < 0)
887 return false; 888 return false;
888 889
889 list_for_each_entry(pos, &evlist->entries, node) { 890 evlist__for_each(evlist, pos) {
890 if (pos->id_pos != evlist->id_pos || 891 if (pos->id_pos != evlist->id_pos ||
891 pos->is_pos != evlist->is_pos) 892 pos->is_pos != evlist->is_pos)
892 return false; 893 return false;
@@ -902,7 +903,7 @@ u64 __perf_evlist__combined_sample_type(struct perf_evlist *evlist)
902 if (evlist->combined_sample_type) 903 if (evlist->combined_sample_type)
903 return evlist->combined_sample_type; 904 return evlist->combined_sample_type;
904 905
905 list_for_each_entry(evsel, &evlist->entries, node) 906 evlist__for_each(evlist, evsel)
906 evlist->combined_sample_type |= evsel->attr.sample_type; 907 evlist->combined_sample_type |= evsel->attr.sample_type;
907 908
908 return evlist->combined_sample_type; 909 return evlist->combined_sample_type;
@@ -920,7 +921,7 @@ bool perf_evlist__valid_read_format(struct perf_evlist *evlist)
920 u64 read_format = first->attr.read_format; 921 u64 read_format = first->attr.read_format;
921 u64 sample_type = first->attr.sample_type; 922 u64 sample_type = first->attr.sample_type;
922 923
923 list_for_each_entry_continue(pos, &evlist->entries, node) { 924 evlist__for_each(evlist, pos) {
924 if (read_format != pos->attr.read_format) 925 if (read_format != pos->attr.read_format)
925 return false; 926 return false;
926 } 927 }
@@ -977,7 +978,7 @@ bool perf_evlist__valid_sample_id_all(struct perf_evlist *evlist)
977{ 978{
978 struct perf_evsel *first = perf_evlist__first(evlist), *pos = first; 979 struct perf_evsel *first = perf_evlist__first(evlist), *pos = first;
979 980
980 list_for_each_entry_continue(pos, &evlist->entries, node) { 981 evlist__for_each_continue(evlist, pos) {
981 if (first->attr.sample_id_all != pos->attr.sample_id_all) 982 if (first->attr.sample_id_all != pos->attr.sample_id_all)
982 return false; 983 return false;
983 } 984 }
@@ -1003,7 +1004,7 @@ void perf_evlist__close(struct perf_evlist *evlist)
1003 int ncpus = cpu_map__nr(evlist->cpus); 1004 int ncpus = cpu_map__nr(evlist->cpus);
1004 int nthreads = thread_map__nr(evlist->threads); 1005 int nthreads = thread_map__nr(evlist->threads);
1005 1006
1006 list_for_each_entry_reverse(evsel, &evlist->entries, node) 1007 evlist__for_each_reverse(evlist, evsel)
1007 perf_evsel__close(evsel, ncpus, nthreads); 1008 perf_evsel__close(evsel, ncpus, nthreads);
1008} 1009}
1009 1010
@@ -1014,7 +1015,7 @@ int perf_evlist__open(struct perf_evlist *evlist)
1014 1015
1015 perf_evlist__update_id_pos(evlist); 1016 perf_evlist__update_id_pos(evlist);
1016 1017
1017 list_for_each_entry(evsel, &evlist->entries, node) { 1018 evlist__for_each(evlist, evsel) {
1018 err = perf_evsel__open(evsel, evlist->cpus, evlist->threads); 1019 err = perf_evsel__open(evsel, evlist->cpus, evlist->threads);
1019 if (err < 0) 1020 if (err < 0)
1020 goto out_err; 1021 goto out_err;
@@ -1029,7 +1030,7 @@ out_err:
1029 1030
1030int perf_evlist__prepare_workload(struct perf_evlist *evlist, struct target *target, 1031int perf_evlist__prepare_workload(struct perf_evlist *evlist, struct target *target,
1031 const char *argv[], bool pipe_output, 1032 const char *argv[], bool pipe_output,
1032 bool want_signal) 1033 void (*exec_error)(int signo, siginfo_t *info, void *ucontext))
1033{ 1034{
1034 int child_ready_pipe[2], go_pipe[2]; 1035 int child_ready_pipe[2], go_pipe[2];
1035 char bf; 1036 char bf;
@@ -1073,12 +1074,25 @@ int perf_evlist__prepare_workload(struct perf_evlist *evlist, struct target *tar
1073 1074
1074 execvp(argv[0], (char **)argv); 1075 execvp(argv[0], (char **)argv);
1075 1076
1076 perror(argv[0]); 1077 if (exec_error) {
1077 if (want_signal) 1078 union sigval val;
1078 kill(getppid(), SIGUSR1); 1079
1080 val.sival_int = errno;
1081 if (sigqueue(getppid(), SIGUSR1, val))
1082 perror(argv[0]);
1083 } else
1084 perror(argv[0]);
1079 exit(-1); 1085 exit(-1);
1080 } 1086 }
1081 1087
1088 if (exec_error) {
1089 struct sigaction act = {
1090 .sa_flags = SA_SIGINFO,
1091 .sa_sigaction = exec_error,
1092 };
1093 sigaction(SIGUSR1, &act, NULL);
1094 }
1095
1082 if (target__none(target)) 1096 if (target__none(target))
1083 evlist->threads->map[0] = evlist->workload.pid; 1097 evlist->threads->map[0] = evlist->workload.pid;
1084 1098
@@ -1140,7 +1154,7 @@ size_t perf_evlist__fprintf(struct perf_evlist *evlist, FILE *fp)
1140 struct perf_evsel *evsel; 1154 struct perf_evsel *evsel;
1141 size_t printed = 0; 1155 size_t printed = 0;
1142 1156
1143 list_for_each_entry(evsel, &evlist->entries, node) { 1157 evlist__for_each(evlist, evsel) {
1144 printed += fprintf(fp, "%s%s", evsel->idx ? ", " : "", 1158 printed += fprintf(fp, "%s%s", evsel->idx ? ", " : "",
1145 perf_evsel__name(evsel)); 1159 perf_evsel__name(evsel));
1146 } 1160 }
@@ -1219,7 +1233,7 @@ void perf_evlist__to_front(struct perf_evlist *evlist,
1219 if (move_evsel == perf_evlist__first(evlist)) 1233 if (move_evsel == perf_evlist__first(evlist))
1220 return; 1234 return;
1221 1235
1222 list_for_each_entry_safe(evsel, n, &evlist->entries, node) { 1236 evlist__for_each_safe(evlist, n, evsel) {
1223 if (evsel->leader == move_evsel->leader) 1237 if (evsel->leader == move_evsel->leader)
1224 list_move_tail(&evsel->node, &move); 1238 list_move_tail(&evsel->node, &move);
1225 } 1239 }
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 2fe51958ed85..f5173cd63693 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -103,7 +103,8 @@ int record_opts__config(struct record_opts *opts);
103int perf_evlist__prepare_workload(struct perf_evlist *evlist, 103int perf_evlist__prepare_workload(struct perf_evlist *evlist,
104 struct target *target, 104 struct target *target,
105 const char *argv[], bool pipe_output, 105 const char *argv[], bool pipe_output,
106 bool want_signal); 106 void (*exec_error)(int signo, siginfo_t *info,
107 void *ucontext));
107int perf_evlist__start_workload(struct perf_evlist *evlist); 108int perf_evlist__start_workload(struct perf_evlist *evlist);
108 109
109int perf_evlist__parse_mmap_pages(const struct option *opt, 110int perf_evlist__parse_mmap_pages(const struct option *opt,
@@ -134,7 +135,6 @@ static inline void perf_evlist__set_maps(struct perf_evlist *evlist,
134} 135}
135 136
136int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target); 137int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target);
137void perf_evlist__delete_maps(struct perf_evlist *evlist);
138int perf_evlist__apply_filters(struct perf_evlist *evlist); 138int perf_evlist__apply_filters(struct perf_evlist *evlist);
139 139
140void __perf_evlist__set_leader(struct list_head *list); 140void __perf_evlist__set_leader(struct list_head *list);
@@ -196,5 +196,70 @@ bool perf_evlist__can_select_event(struct perf_evlist *evlist, const char *str);
196void perf_evlist__to_front(struct perf_evlist *evlist, 196void perf_evlist__to_front(struct perf_evlist *evlist,
197 struct perf_evsel *move_evsel); 197 struct perf_evsel *move_evsel);
198 198
199/**
200 * __evlist__for_each - iterate thru all the evsels
201 * @list: list_head instance to iterate
202 * @evsel: struct evsel iterator
203 */
204#define __evlist__for_each(list, evsel) \
205 list_for_each_entry(evsel, list, node)
206
207/**
208 * evlist__for_each - iterate thru all the evsels
209 * @evlist: evlist instance to iterate
210 * @evsel: struct evsel iterator
211 */
212#define evlist__for_each(evlist, evsel) \
213 __evlist__for_each(&(evlist)->entries, evsel)
214
215/**
216 * __evlist__for_each_continue - continue iteration thru all the evsels
217 * @list: list_head instance to iterate
218 * @evsel: struct evsel iterator
219 */
220#define __evlist__for_each_continue(list, evsel) \
221 list_for_each_entry_continue(evsel, list, node)
222
223/**
224 * evlist__for_each_continue - continue iteration thru all the evsels
225 * @evlist: evlist instance to iterate
226 * @evsel: struct evsel iterator
227 */
228#define evlist__for_each_continue(evlist, evsel) \
229 __evlist__for_each_continue(&(evlist)->entries, evsel)
230
231/**
232 * __evlist__for_each_reverse - iterate thru all the evsels in reverse order
233 * @list: list_head instance to iterate
234 * @evsel: struct evsel iterator
235 */
236#define __evlist__for_each_reverse(list, evsel) \
237 list_for_each_entry_reverse(evsel, list, node)
238
239/**
240 * evlist__for_each_reverse - iterate thru all the evsels in reverse order
241 * @evlist: evlist instance to iterate
242 * @evsel: struct evsel iterator
243 */
244#define evlist__for_each_reverse(evlist, evsel) \
245 __evlist__for_each_reverse(&(evlist)->entries, evsel)
246
247/**
248 * __evlist__for_each_safe - safely iterate thru all the evsels
249 * @list: list_head instance to iterate
250 * @tmp: struct evsel temp iterator
251 * @evsel: struct evsel iterator
252 */
253#define __evlist__for_each_safe(list, tmp, evsel) \
254 list_for_each_entry_safe(evsel, tmp, list, node)
255
256/**
257 * evlist__for_each_safe - safely iterate thru all the evsels
258 * @evlist: evlist instance to iterate
259 * @evsel: struct evsel iterator
260 * @tmp: struct evsel temp iterator
261 */
262#define evlist__for_each_safe(evlist, tmp, evsel) \
263 __evlist__for_each_safe(&(evlist)->entries, tmp, evsel)
199 264
200#endif /* __PERF_EVLIST_H */ 265#endif /* __PERF_EVLIST_H */
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index ade8d9c1c431..cd4630abfa43 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -658,7 +658,8 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts)
658 * Setting enable_on_exec for independent events and 658 * Setting enable_on_exec for independent events and
659 * group leaders for traced executed by perf. 659 * group leaders for traced executed by perf.
660 */ 660 */
661 if (target__none(&opts->target) && perf_evsel__is_group_leader(evsel)) 661 if (target__none(&opts->target) && perf_evsel__is_group_leader(evsel) &&
662 !opts->initial_delay)
662 attr->enable_on_exec = 1; 663 attr->enable_on_exec = 1;
663} 664}
664 665
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index a4a60b7887ee..bb3e0ede6183 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -643,8 +643,7 @@ static int write_event_desc(int fd, struct perf_header *h __maybe_unused,
643 if (ret < 0) 643 if (ret < 0)
644 return ret; 644 return ret;
645 645
646 list_for_each_entry(evsel, &evlist->entries, node) { 646 evlist__for_each(evlist, evsel) {
647
648 ret = do_write(fd, &evsel->attr, sz); 647 ret = do_write(fd, &evsel->attr, sz);
649 if (ret < 0) 648 if (ret < 0)
650 return ret; 649 return ret;
@@ -1092,7 +1091,7 @@ static int write_group_desc(int fd, struct perf_header *h __maybe_unused,
1092 if (ret < 0) 1091 if (ret < 0)
1093 return ret; 1092 return ret;
1094 1093
1095 list_for_each_entry(evsel, &evlist->entries, node) { 1094 evlist__for_each(evlist, evsel) {
1096 if (perf_evsel__is_group_leader(evsel) && 1095 if (perf_evsel__is_group_leader(evsel) &&
1097 evsel->nr_members > 1) { 1096 evsel->nr_members > 1) {
1098 const char *name = evsel->group_name ?: "{anon_group}"; 1097 const char *name = evsel->group_name ?: "{anon_group}";
@@ -1487,7 +1486,7 @@ static void print_group_desc(struct perf_header *ph, int fd __maybe_unused,
1487 1486
1488 session = container_of(ph, struct perf_session, header); 1487 session = container_of(ph, struct perf_session, header);
1489 1488
1490 list_for_each_entry(evsel, &session->evlist->entries, node) { 1489 evlist__for_each(session->evlist, evsel) {
1491 if (perf_evsel__is_group_leader(evsel) && 1490 if (perf_evsel__is_group_leader(evsel) &&
1492 evsel->nr_members > 1) { 1491 evsel->nr_members > 1) {
1493 fprintf(fp, "# group: %s{%s", evsel->group_name ?: "", 1492 fprintf(fp, "# group: %s{%s", evsel->group_name ?: "",
@@ -1768,7 +1767,7 @@ perf_evlist__find_by_index(struct perf_evlist *evlist, int idx)
1768{ 1767{
1769 struct perf_evsel *evsel; 1768 struct perf_evsel *evsel;
1770 1769
1771 list_for_each_entry(evsel, &evlist->entries, node) { 1770 evlist__for_each(evlist, evsel) {
1772 if (evsel->idx == idx) 1771 if (evsel->idx == idx)
1773 return evsel; 1772 return evsel;
1774 } 1773 }
@@ -2071,7 +2070,7 @@ static int process_group_desc(struct perf_file_section *section __maybe_unused,
2071 session->evlist->nr_groups = nr_groups; 2070 session->evlist->nr_groups = nr_groups;
2072 2071
2073 i = nr = 0; 2072 i = nr = 0;
2074 list_for_each_entry(evsel, &session->evlist->entries, node) { 2073 evlist__for_each(session->evlist, evsel) {
2075 if (evsel->idx == (int) desc[i].leader_idx) { 2074 if (evsel->idx == (int) desc[i].leader_idx) {
2076 evsel->leader = evsel; 2075 evsel->leader = evsel;
2077 /* {anon_group} is a dummy name */ 2076 /* {anon_group} is a dummy name */
@@ -2298,7 +2297,7 @@ int perf_session__write_header(struct perf_session *session,
2298 2297
2299 lseek(fd, sizeof(f_header), SEEK_SET); 2298 lseek(fd, sizeof(f_header), SEEK_SET);
2300 2299
2301 list_for_each_entry(evsel, &evlist->entries, node) { 2300 evlist__for_each(session->evlist, evsel) {
2302 evsel->id_offset = lseek(fd, 0, SEEK_CUR); 2301 evsel->id_offset = lseek(fd, 0, SEEK_CUR);
2303 err = do_write(fd, evsel->id, evsel->ids * sizeof(u64)); 2302 err = do_write(fd, evsel->id, evsel->ids * sizeof(u64));
2304 if (err < 0) { 2303 if (err < 0) {
@@ -2309,7 +2308,7 @@ int perf_session__write_header(struct perf_session *session,
2309 2308
2310 attr_offset = lseek(fd, 0, SEEK_CUR); 2309 attr_offset = lseek(fd, 0, SEEK_CUR);
2311 2310
2312 list_for_each_entry(evsel, &evlist->entries, node) { 2311 evlist__for_each(evlist, evsel) {
2313 f_attr = (struct perf_file_attr){ 2312 f_attr = (struct perf_file_attr){
2314 .attr = evsel->attr, 2313 .attr = evsel->attr,
2315 .ids = { 2314 .ids = {
@@ -2742,7 +2741,7 @@ static int perf_evlist__prepare_tracepoint_events(struct perf_evlist *evlist,
2742{ 2741{
2743 struct perf_evsel *pos; 2742 struct perf_evsel *pos;
2744 2743
2745 list_for_each_entry(pos, &evlist->entries, node) { 2744 evlist__for_each(evlist, pos) {
2746 if (pos->attr.type == PERF_TYPE_TRACEPOINT && 2745 if (pos->attr.type == PERF_TYPE_TRACEPOINT &&
2747 perf_evsel__prepare_tracepoint_event(pos, pevent)) 2746 perf_evsel__prepare_tracepoint_event(pos, pevent))
2748 return -1; 2747 return -1;
@@ -2890,7 +2889,7 @@ int perf_event__synthesize_attrs(struct perf_tool *tool,
2890 struct perf_evsel *evsel; 2889 struct perf_evsel *evsel;
2891 int err = 0; 2890 int err = 0;
2892 2891
2893 list_for_each_entry(evsel, &session->evlist->entries, node) { 2892 evlist__for_each(session->evlist, evsel) {
2894 err = perf_event__synthesize_attr(tool, &evsel->attr, evsel->ids, 2893 err = perf_event__synthesize_attr(tool, &evsel->attr, evsel->ids,
2895 evsel->id, process); 2894 evsel->id, process);
2896 if (err) { 2895 if (err) {
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 307c9aed972e..a2d047bdf4ef 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -77,16 +77,16 @@ struct perf_session_env {
77 unsigned long long total_mem; 77 unsigned long long total_mem;
78 78
79 int nr_cmdline; 79 int nr_cmdline;
80 char *cmdline;
81 int nr_sibling_cores; 80 int nr_sibling_cores;
82 char *sibling_cores;
83 int nr_sibling_threads; 81 int nr_sibling_threads;
84 char *sibling_threads;
85 int nr_numa_nodes; 82 int nr_numa_nodes;
86 char *numa_nodes;
87 int nr_pmu_mappings; 83 int nr_pmu_mappings;
88 char *pmu_mappings;
89 int nr_groups; 84 int nr_groups;
85 char *cmdline;
86 char *sibling_cores;
87 char *sibling_threads;
88 char *numa_nodes;
89 char *pmu_mappings;
90}; 90};
91 91
92struct perf_header { 92struct perf_header {
diff --git a/tools/perf/util/include/asm/bug.h b/tools/perf/util/include/asm/bug.h
deleted file mode 100644
index 7fcc6810adc2..000000000000
--- a/tools/perf/util/include/asm/bug.h
+++ /dev/null
@@ -1,22 +0,0 @@
1#ifndef _PERF_ASM_GENERIC_BUG_H
2#define _PERF_ASM_GENERIC_BUG_H
3
4#define __WARN_printf(arg...) do { fprintf(stderr, arg); } while (0)
5
6#define WARN(condition, format...) ({ \
7 int __ret_warn_on = !!(condition); \
8 if (unlikely(__ret_warn_on)) \
9 __WARN_printf(format); \
10 unlikely(__ret_warn_on); \
11})
12
13#define WARN_ONCE(condition, format...) ({ \
14 static int __warned; \
15 int __ret_warn_once = !!(condition); \
16 \
17 if (unlikely(__ret_warn_once)) \
18 if (WARN(!__warned, format)) \
19 __warned = 1; \
20 unlikely(__ret_warn_once); \
21})
22#endif
diff --git a/tools/perf/util/include/linux/compiler.h b/tools/perf/util/include/linux/compiler.h
deleted file mode 100644
index b003ad7200b2..000000000000
--- a/tools/perf/util/include/linux/compiler.h
+++ /dev/null
@@ -1,30 +0,0 @@
1#ifndef _PERF_LINUX_COMPILER_H_
2#define _PERF_LINUX_COMPILER_H_
3
4#ifndef __always_inline
5# define __always_inline inline __attribute__((always_inline))
6#endif
7
8#define __user
9
10#ifndef __attribute_const__
11# define __attribute_const__
12#endif
13
14#ifndef __maybe_unused
15# define __maybe_unused __attribute__((unused))
16#endif
17
18#ifndef __packed
19# define __packed __attribute__((__packed__))
20#endif
21
22#ifndef __force
23# define __force
24#endif
25
26#ifndef __weak
27# define __weak __attribute__((weak))
28#endif
29
30#endif
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
index a98538dc465a..0130279aac51 100644
--- a/tools/perf/util/machine.c
+++ b/tools/perf/util/machine.c
@@ -27,6 +27,7 @@ int machine__init(struct machine *machine, const char *root_dir, pid_t pid)
27 machine->pid = pid; 27 machine->pid = pid;
28 28
29 machine->symbol_filter = NULL; 29 machine->symbol_filter = NULL;
30 machine->id_hdr_size = 0;
30 31
31 machine->root_dir = strdup(root_dir); 32 machine->root_dir = strdup(root_dir);
32 if (machine->root_dir == NULL) 33 if (machine->root_dir == NULL)
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index 0153435b8427..a7f1b6a91fdd 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -820,8 +820,7 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add)
820 if (!add && get_event_modifier(&mod, str, NULL)) 820 if (!add && get_event_modifier(&mod, str, NULL))
821 return -EINVAL; 821 return -EINVAL;
822 822
823 list_for_each_entry(evsel, list, node) { 823 __evlist__for_each(list, evsel) {
824
825 if (add && get_event_modifier(&mod, str, evsel)) 824 if (add && get_event_modifier(&mod, str, evsel))
826 return -EINVAL; 825 return -EINVAL;
827 826
@@ -845,7 +844,7 @@ int parse_events_name(struct list_head *list, char *name)
845{ 844{
846 struct perf_evsel *evsel; 845 struct perf_evsel *evsel;
847 846
848 list_for_each_entry(evsel, list, node) { 847 __evlist__for_each(list, evsel) {
849 if (!evsel->name) 848 if (!evsel->name)
850 evsel->name = strdup(name); 849 evsel->name = strdup(name);
851 } 850 }
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
index 0934d645ebdc..d9cab4d27192 100644
--- a/tools/perf/util/pmu.c
+++ b/tools/perf/util/pmu.c
@@ -505,7 +505,7 @@ static __u64 pmu_format_value(unsigned long *format, __u64 value)
505 505
506/* 506/*
507 * Setup one of config[12] attr members based on the 507 * Setup one of config[12] attr members based on the
508 * user input data - temr parameter. 508 * user input data - term parameter.
509 */ 509 */
510static int pmu_config_term(struct list_head *formats, 510static int pmu_config_term(struct list_head *formats,
511 struct perf_event_attr *attr, 511 struct perf_event_attr *attr,
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 86ed8580c3cb..a4ee6b4a840f 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -172,6 +172,7 @@ const char *kernel_get_module_path(const char *module)
172 return (dso) ? dso->long_name : NULL; 172 return (dso) ? dso->long_name : NULL;
173} 173}
174 174
175#ifdef HAVE_DWARF_SUPPORT
175/* Copied from unwind.c */ 176/* Copied from unwind.c */
176static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, 177static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
177 GElf_Shdr *shp, const char *name) 178 GElf_Shdr *shp, const char *name)
@@ -217,6 +218,7 @@ out:
217 elf_end(elf); 218 elf_end(elf);
218 return ret; 219 return ret;
219} 220}
221#endif
220 222
221static int init_user_exec(void) 223static int init_user_exec(void)
222{ 224{
@@ -750,7 +752,8 @@ static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp,
750 752
751static int try_to_find_probe_trace_events(struct perf_probe_event *pev, 753static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
752 struct probe_trace_event **tevs __maybe_unused, 754 struct probe_trace_event **tevs __maybe_unused,
753 int max_tevs __maybe_unused, const char *target) 755 int max_tevs __maybe_unused,
756 const char *target __maybe_unused)
754{ 757{
755 if (perf_probe_event_need_dwarf(pev)) { 758 if (perf_probe_event_need_dwarf(pev)) {
756 pr_warning("Debuginfo-analysis is not supported.\n"); 759 pr_warning("Debuginfo-analysis is not supported.\n");
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index 4bf8ace7f511..122669c18ff4 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -908,9 +908,10 @@ static PyObject *pyrf_evlist__item(PyObject *obj, Py_ssize_t i)
908 if (i >= pevlist->evlist.nr_entries) 908 if (i >= pevlist->evlist.nr_entries)
909 return NULL; 909 return NULL;
910 910
911 list_for_each_entry(pos, &pevlist->evlist.entries, node) 911 evlist__for_each(&pevlist->evlist, pos) {
912 if (i-- == 0) 912 if (i-- == 0)
913 break; 913 break;
914 }
914 915
915 return Py_BuildValue("O", container_of(pos, struct pyrf_evsel, evsel)); 916 return Py_BuildValue("O", container_of(pos, struct pyrf_evsel, evsel));
916} 917}
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
index 104a47563d39..373762501dad 100644
--- a/tools/perf/util/record.c
+++ b/tools/perf/util/record.c
@@ -89,19 +89,19 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts)
89 if (evlist->cpus->map[0] < 0) 89 if (evlist->cpus->map[0] < 0)
90 opts->no_inherit = true; 90 opts->no_inherit = true;
91 91
92 list_for_each_entry(evsel, &evlist->entries, node) 92 evlist__for_each(evlist, evsel)
93 perf_evsel__config(evsel, opts); 93 perf_evsel__config(evsel, opts);
94 94
95 if (evlist->nr_entries > 1) { 95 if (evlist->nr_entries > 1) {
96 struct perf_evsel *first = perf_evlist__first(evlist); 96 struct perf_evsel *first = perf_evlist__first(evlist);
97 97
98 list_for_each_entry(evsel, &evlist->entries, node) { 98 evlist__for_each(evlist, evsel) {
99 if (evsel->attr.sample_type == first->attr.sample_type) 99 if (evsel->attr.sample_type == first->attr.sample_type)
100 continue; 100 continue;
101 use_sample_identifier = perf_can_sample_identifier(); 101 use_sample_identifier = perf_can_sample_identifier();
102 break; 102 break;
103 } 103 }
104 list_for_each_entry(evsel, &evlist->entries, node) 104 evlist__for_each(evlist, evsel)
105 perf_evsel__set_sample_id(evsel, use_sample_identifier); 105 perf_evsel__set_sample_id(evsel, use_sample_identifier);
106 } 106 }
107 107
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 8ffe29c55d0f..7acc03e8f3b2 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1384,7 +1384,7 @@ bool perf_session__has_traces(struct perf_session *session, const char *msg)
1384{ 1384{
1385 struct perf_evsel *evsel; 1385 struct perf_evsel *evsel;
1386 1386
1387 list_for_each_entry(evsel, &session->evlist->entries, node) { 1387 evlist__for_each(session->evlist, evsel) {
1388 if (evsel->attr.type == PERF_TYPE_TRACEPOINT) 1388 if (evsel->attr.type == PERF_TYPE_TRACEPOINT)
1389 return true; 1389 return true;
1390 } 1390 }
@@ -1442,7 +1442,7 @@ size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
1442 1442
1443 ret += events_stats__fprintf(&session->stats, fp); 1443 ret += events_stats__fprintf(&session->stats, fp);
1444 1444
1445 list_for_each_entry(pos, &session->evlist->entries, node) { 1445 evlist__for_each(session->evlist, pos) {
1446 ret += fprintf(fp, "%s stats:\n", perf_evsel__name(pos)); 1446 ret += fprintf(fp, "%s stats:\n", perf_evsel__name(pos));
1447 ret += events_stats__fprintf(&pos->hists.stats, fp); 1447 ret += events_stats__fprintf(&pos->hists.stats, fp);
1448 } 1448 }
@@ -1464,7 +1464,7 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
1464{ 1464{
1465 struct perf_evsel *pos; 1465 struct perf_evsel *pos;
1466 1466
1467 list_for_each_entry(pos, &session->evlist->entries, node) { 1467 evlist__for_each(session->evlist, pos) {
1468 if (pos->attr.type == type) 1468 if (pos->attr.type == type)
1469 return pos; 1469 return pos;
1470 } 1470 }
diff --git a/tools/perf/util/unwind.c b/tools/perf/util/unwind.c
index 0efd5393de85..416f22bf3693 100644
--- a/tools/perf/util/unwind.c
+++ b/tools/perf/util/unwind.c
@@ -340,10 +340,10 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
340 /* Check the .debug_frame section for unwinding info */ 340 /* Check the .debug_frame section for unwinding info */
341 if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) { 341 if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) {
342 memset(&di, 0, sizeof(di)); 342 memset(&di, 0, sizeof(di));
343 dwarf_find_debug_frame(0, &di, ip, 0, map->dso->name, 343 if (dwarf_find_debug_frame(0, &di, ip, 0, map->dso->name,
344 map->start, map->end); 344 map->start, map->end))
345 return dwarf_search_unwind_table(as, ip, &di, pi, 345 return dwarf_search_unwind_table(as, ip, &di, pi,
346 need_unwind_info, arg); 346 need_unwind_info, arg);
347 } 347 }
348#endif 348#endif
349 349