diff options
55 files changed, 724 insertions, 436 deletions
diff --git a/tools/perf/util/include/asm/bug.h b/tools/include/asm/bug.h index 7fcc6810adc2..9e5f4846967f 100644 --- a/tools/perf/util/include/asm/bug.h +++ b/tools/include/asm/bug.h | |||
@@ -1,5 +1,7 @@ | |||
1 | #ifndef _PERF_ASM_GENERIC_BUG_H | 1 | #ifndef _TOOLS_ASM_BUG_H |
2 | #define _PERF_ASM_GENERIC_BUG_H | 2 | #define _TOOLS_ASM_BUG_H |
3 | |||
4 | #include <linux/compiler.h> | ||
3 | 5 | ||
4 | #define __WARN_printf(arg...) do { fprintf(stderr, arg); } while (0) | 6 | #define __WARN_printf(arg...) do { fprintf(stderr, arg); } while (0) |
5 | 7 | ||
@@ -19,4 +21,5 @@ | |||
19 | __warned = 1; \ | 21 | __warned = 1; \ |
20 | unlikely(__ret_warn_once); \ | 22 | unlikely(__ret_warn_once); \ |
21 | }) | 23 | }) |
22 | #endif | 24 | |
25 | #endif /* _TOOLS_ASM_BUG_H */ | ||
diff --git a/tools/perf/util/include/linux/compiler.h b/tools/include/linux/compiler.h index b003ad7200b2..fbc6665c6d53 100644 --- a/tools/perf/util/include/linux/compiler.h +++ b/tools/include/linux/compiler.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifndef _PERF_LINUX_COMPILER_H_ | 1 | #ifndef _TOOLS_LINUX_COMPILER_H_ |
2 | #define _PERF_LINUX_COMPILER_H_ | 2 | #define _TOOLS_LINUX_COMPILER_H_ |
3 | 3 | ||
4 | #ifndef __always_inline | 4 | #ifndef __always_inline |
5 | # define __always_inline inline __attribute__((always_inline)) | 5 | # define __always_inline inline __attribute__((always_inline)) |
@@ -27,4 +27,12 @@ | |||
27 | # define __weak __attribute__((weak)) | 27 | # define __weak __attribute__((weak)) |
28 | #endif | 28 | #endif |
29 | 29 | ||
30 | #ifndef likely | ||
31 | # define likely(x) __builtin_expect(!!(x), 1) | ||
30 | #endif | 32 | #endif |
33 | |||
34 | #ifndef unlikely | ||
35 | # define unlikely(x) __builtin_expect(!!(x), 0) | ||
36 | #endif | ||
37 | |||
38 | #endif /* _TOOLS_LINUX_COMPILER_H */ | ||
diff --git a/tools/lib/traceevent/Makefile b/tools/lib/traceevent/Makefile index ca4ab78425d1..f778d48ac609 100644 --- a/tools/lib/traceevent/Makefile +++ b/tools/lib/traceevent/Makefile | |||
@@ -86,8 +86,8 @@ ifeq ($(BUILD_SRC),) | |||
86 | ifneq ($(OUTPUT),) | 86 | ifneq ($(OUTPUT),) |
87 | 87 | ||
88 | define build_output | 88 | define build_output |
89 | $(if $(VERBOSE:1=),@)+$(MAKE) -C $(OUTPUT) \ | 89 | $(if $(VERBOSE:1=),@)+$(MAKE) -C $(OUTPUT) \ |
90 | BUILD_SRC=$(CURDIR)/ -f $(CURDIR)/Makefile $1 | 90 | BUILD_SRC=$(CURDIR)/ -f $(CURDIR)/Makefile $1 |
91 | endef | 91 | endef |
92 | 92 | ||
93 | all: sub-make | 93 | all: sub-make |
@@ -221,23 +221,23 @@ $(PLUGINS): %.so: %.o | |||
221 | $(QUIET_LINK)$(CC) $(CFLAGS) -shared -nostartfiles -o $@ $< | 221 | $(QUIET_LINK)$(CC) $(CFLAGS) -shared -nostartfiles -o $@ $< |
222 | 222 | ||
223 | define make_version.h | 223 | define make_version.h |
224 | (echo '/* This file is automatically generated. Do not modify. */'; \ | 224 | (echo '/* This file is automatically generated. Do not modify. */'; \ |
225 | echo \#define VERSION_CODE $(shell \ | 225 | echo \#define VERSION_CODE $(shell \ |
226 | expr $(VERSION) \* 256 + $(PATCHLEVEL)); \ | 226 | expr $(VERSION) \* 256 + $(PATCHLEVEL)); \ |
227 | echo '#define EXTRAVERSION ' $(EXTRAVERSION); \ | 227 | echo '#define EXTRAVERSION ' $(EXTRAVERSION); \ |
228 | echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"'; \ | 228 | echo '#define VERSION_STRING "'$(VERSION).$(PATCHLEVEL).$(EXTRAVERSION)'"'; \ |
229 | echo '#define FILE_VERSION '$(FILE_VERSION); \ | 229 | echo '#define FILE_VERSION '$(FILE_VERSION); \ |
230 | ) > $1 | 230 | ) > $1 |
231 | endef | 231 | endef |
232 | 232 | ||
233 | define update_version.h | 233 | define update_version.h |
234 | ($(call make_version.h, $@.tmp); \ | 234 | ($(call make_version.h, $@.tmp); \ |
235 | if [ -r $@ ] && cmp -s $@ $@.tmp; then \ | 235 | if [ -r $@ ] && cmp -s $@ $@.tmp; then \ |
236 | rm -f $@.tmp; \ | 236 | rm -f $@.tmp; \ |
237 | else \ | 237 | else \ |
238 | echo ' UPDATE $@'; \ | 238 | echo ' UPDATE $@'; \ |
239 | mv -f $@.tmp $@; \ | 239 | mv -f $@.tmp $@; \ |
240 | fi); | 240 | fi); |
241 | endef | 241 | endef |
242 | 242 | ||
243 | ep_version.h: force | 243 | ep_version.h: force |
@@ -246,13 +246,13 @@ ep_version.h: force | |||
246 | VERSION_FILES = ep_version.h | 246 | VERSION_FILES = ep_version.h |
247 | 247 | ||
248 | define update_dir | 248 | define update_dir |
249 | (echo $1 > $@.tmp; \ | 249 | (echo $1 > $@.tmp; \ |
250 | if [ -r $@ ] && cmp -s $@ $@.tmp; then \ | 250 | if [ -r $@ ] && cmp -s $@ $@.tmp; then \ |
251 | rm -f $@.tmp; \ | 251 | rm -f $@.tmp; \ |
252 | else \ | 252 | else \ |
253 | echo ' UPDATE $@'; \ | 253 | echo ' UPDATE $@'; \ |
254 | mv -f $@.tmp $@; \ | 254 | mv -f $@.tmp $@; \ |
255 | fi); | 255 | fi); |
256 | endef | 256 | endef |
257 | 257 | ||
258 | ## make deps | 258 | ## make deps |
@@ -262,10 +262,10 @@ all_deps := $(all_objs:%.o=.%.d) | |||
262 | 262 | ||
263 | # let .d file also depends on the source and header files | 263 | # let .d file also depends on the source and header files |
264 | define check_deps | 264 | define check_deps |
265 | @set -e; $(RM) $@; \ | 265 | @set -e; $(RM) $@; \ |
266 | $(CC) -MM $(CFLAGS) $< > $@.$$$$; \ | 266 | $(CC) -MM $(CFLAGS) $< > $@.$$$$; \ |
267 | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ | 267 | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ |
268 | $(RM) $@.$$$$ | 268 | $(RM) $@.$$$$ |
269 | endef | 269 | endef |
270 | 270 | ||
271 | $(all_deps): .%.d: $(src)/%.c | 271 | $(all_deps): .%.d: $(src)/%.c |
@@ -329,9 +329,12 @@ clean: | |||
329 | 329 | ||
330 | endif # skip-makefile | 330 | endif # skip-makefile |
331 | 331 | ||
332 | PHONY += force | 332 | PHONY += force plugins |
333 | force: | 333 | force: |
334 | 334 | ||
335 | plugins: | ||
336 | @echo > /dev/null | ||
337 | |||
335 | # Declare the contents of the .PHONY variable as phony. We keep that | 338 | # Declare the contents of the .PHONY variable as phony. We keep that |
336 | # information in a variable so we can use it in if_changed and friends. | 339 | # information in a variable so we can use it in if_changed and friends. |
337 | .PHONY: $(PHONY) | 340 | .PHONY: $(PHONY) |
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 | |||
209 | inheritance is automatically disabled. --per-thread is ignored with a warning | 209 | inheritance is automatically disabled. --per-thread is ignored with a warning |
210 | if combined with -a or -C options. | 210 | if combined with -a or -C options. |
211 | 211 | ||
212 | --initial-delay msecs:: | ||
213 | After starting the program, wait msecs before measuring. This is useful to | ||
214 | filter out the startup phase of the program, which is often very different. | ||
215 | |||
212 | SEE ALSO | 216 | SEE ALSO |
213 | -------- | 217 | -------- |
214 | linkperf:perf-stat[1], linkperf:perf-list[1] | 218 | linkperf: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 | |||
133 | core number and the number of online logical processors on that physical processor. | 133 | core 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:: |
137 | After starting the program, wait msecs before measuring. This is useful to | 137 | After starting the program, wait msecs before measuring. This is useful to |
138 | filter out the startup phase of the program, which is often very different. | 138 | filter 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 @@ | |||
1 | tools/perf | 1 | tools/perf |
2 | tools/scripts | 2 | tools/scripts |
3 | tools/lib/traceevent | 3 | tools/lib/traceevent |
4 | tools/lib/lk | 4 | tools/lib/api |
5 | tools/lib/symbol/kallsyms.c | 5 | tools/lib/symbol/kallsyms.c |
6 | tools/lib/symbol/kallsyms.h | 6 | tools/lib/symbol/kallsyms.h |
7 | tools/include/asm/bug.h | ||
8 | tools/include/linux/compiler.h | ||
7 | include/linux/const.h | 9 | include/linux/const.h |
8 | include/linux/perf_event.h | 10 | include/linux/perf_event.h |
9 | include/linux/rbtree.h | 11 | include/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 | |||
211 | LIB_H += ../../include/linux/stringify.h | 211 | LIB_H += ../../include/linux/stringify.h |
212 | LIB_H += util/include/linux/bitmap.h | 212 | LIB_H += util/include/linux/bitmap.h |
213 | LIB_H += util/include/linux/bitops.h | 213 | LIB_H += util/include/linux/bitops.h |
214 | LIB_H += util/include/linux/compiler.h | 214 | LIB_H += ../include/linux/compiler.h |
215 | LIB_H += util/include/linux/const.h | 215 | LIB_H += util/include/linux/const.h |
216 | LIB_H += util/include/linux/ctype.h | 216 | LIB_H += util/include/linux/ctype.h |
217 | LIB_H += util/include/linux/kernel.h | 217 | LIB_H += util/include/linux/kernel.h |
@@ -226,7 +226,7 @@ LIB_H += util/include/linux/string.h | |||
226 | LIB_H += util/include/linux/types.h | 226 | LIB_H += util/include/linux/types.h |
227 | LIB_H += util/include/linux/linkage.h | 227 | LIB_H += util/include/linux/linkage.h |
228 | LIB_H += util/include/asm/asm-offsets.h | 228 | LIB_H += util/include/asm/asm-offsets.h |
229 | LIB_H += util/include/asm/bug.h | 229 | LIB_H += ../include/asm/bug.h |
230 | LIB_H += util/include/asm/byteorder.h | 230 | LIB_H += util/include/asm/byteorder.h |
231 | LIB_H += util/include/asm/hweight.h | 231 | LIB_H += util/include/asm/hweight.h |
232 | LIB_H += util/include/asm/swab.h | 232 | LIB_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 | ||
773 | static 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 | } | ||
825 | dummy_print: | ||
826 | return scnprintf(hpp->buf, hpp->size, "%*s", | ||
827 | dfmt->header_width, pfmt); | ||
828 | } | ||
829 | |||
830 | static 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 | |||
836 | static 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 | |||
842 | static 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 | |||
772 | static void | 848 | static void |
773 | hpp__entry_unpair(struct hist_entry *he, int idx, char *buf, size_t size) | 849 | hpp__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) { |
187 | try_again: | 187 | try_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 | ||
325 | static void record__init_features(struct record *rec) | 325 | static 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 | ||
343 | static 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 | */ | ||
350 | static 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 | |||
344 | static int __cmd_record(struct record *rec, int argc, const char **argv) | 359 | static 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[] = { | |||
878 | int cmd_record(int argc, const char **argv, const char *prefix __maybe_unused) | 906 | int 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); | ||
956 | out_free_fd: | ||
957 | perf_evlist__delete_maps(evsel_list); | ||
958 | out_symbol_exit: | 978 | out_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 | ||
415 | static int __cmd_report(struct report *rep) | 415 | static 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) { | 444 | static 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 | |||
459 | static 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 | |||
489 | static 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 | |||
532 | static 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 | ||
557 | static int | 591 | static 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 | ||
512 | static 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 | */ | ||
519 | static 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 | |||
512 | static int __run_perf_stat(int argc, const char **argv) | 525 | static 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 | ||
628 | static int run_perf_stat(int argc __maybe_unused, const char **argv) | 648 | static 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); |
1804 | out_free_maps: | ||
1805 | perf_evlist__delete_maps(evsel_list); | ||
1806 | out: | 1824 | out: |
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) { |
862 | try_again: | 862 | try_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 | ||
1209 | out_delete_maps: | ||
1210 | perf_evlist__delete_maps(top.evlist); | ||
1211 | out_delete_evlist: | 1209 | out_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 | ||
1185 | static int trace__set_fd_pathname(struct thread *thread, int fd, const char *pathname) | 1186 | static 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); | ||
1997 | out_close_evlist: | ||
1998 | perf_evlist__close(evlist); | ||
1999 | out_delete_maps: | ||
2000 | perf_evlist__delete_maps(evlist); | ||
2001 | out_delete_evlist: | 1997 | out_delete_evlist: |
2002 | perf_evlist__delete(evlist); | 1998 | perf_evlist__delete(evlist); |
2003 | out: | 1999 | out: |
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 @@ | |||
1 | uname_M := $(shell uname -m 2>/dev/null || echo not) | ||
2 | 1 | ||
3 | ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \ | 2 | ifeq ($(src-perf),) |
4 | -e s/arm.*/arm/ -e s/sa110/arm/ \ | 3 | src-perf := $(srctree)/tools/perf |
5 | -e s/s390x/s390/ -e s/parisc64/parisc/ \ | 4 | endif |
6 | -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ | ||
7 | -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ ) | ||
8 | NO_PERF_REGS := 1 | ||
9 | CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS) | ||
10 | 5 | ||
11 | # Additional ARCH settings for x86 | 6 | ifeq ($(obj-perf),) |
12 | ifeq ($(ARCH),i386) | 7 | obj-perf := $(OUTPUT) |
13 | override ARCH := x86 | ||
14 | NO_PERF_REGS := 0 | ||
15 | LIBUNWIND_LIBS = -lunwind -lunwind-x86 | ||
16 | endif | 8 | endif |
17 | 9 | ||
18 | ifeq ($(ARCH),x86_64) | 10 | ifneq ($(obj-perf),) |
19 | override ARCH := x86 | 11 | obj-perf := $(abspath $(obj-perf))/ |
20 | IS_X86_64 := 0 | 12 | endif |
21 | ifeq (, $(findstring m32,$(CFLAGS))) | 13 | |
22 | IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1) | 14 | LIB_INCLUDE := $(srctree)/tools/lib/ |
23 | endif | 15 | CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS) |
16 | |||
17 | include $(src-perf)/config/Makefile.arch | ||
18 | |||
19 | NO_PERF_REGS := 1 | ||
20 | |||
21 | # Additional ARCH settings for x86 | ||
22 | ifeq ($(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) | ||
61 | endif | 56 | endif |
62 | 57 | ||
63 | ifeq ($(NO_PERF_REGS),0) | 58 | ifeq ($(NO_PERF_REGS),0) |
64 | CFLAGS += -DHAVE_PERF_REGS_SUPPORT | 59 | CFLAGS += -DHAVE_PERF_REGS_SUPPORT |
65 | endif | 60 | endif |
66 | 61 | ||
67 | ifeq ($(src-perf),) | ||
68 | src-perf := $(srctree)/tools/perf | ||
69 | endif | ||
70 | |||
71 | ifeq ($(obj-perf),) | ||
72 | obj-perf := $(OUTPUT) | ||
73 | endif | ||
74 | |||
75 | ifneq ($(obj-perf),) | ||
76 | obj-perf := $(abspath $(obj-perf))/ | ||
77 | endif | ||
78 | |||
79 | LIB_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 ;-). | ||
155 | set_test_all_flags = $(eval $(set_test_all_flags_code)) | ||
156 | define set_test_all_flags_code | ||
157 | FEATURE_CHECK_CFLAGS-all += $(FEATURE_CHECK_CFLAGS-$(1)) | ||
158 | FEATURE_CHECK_LDFLAGS-all += $(FEATURE_CHECK_LDFLAGS-$(1)) | ||
159 | endef | ||
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 | ||
241 | CFLAGS += -I$(src-perf)/util/include | 233 | CFLAGS += -I$(src-perf)/util/include |
242 | CFLAGS += -I$(src-perf)/arch/$(ARCH)/include | 234 | CFLAGS += -I$(src-perf)/arch/$(ARCH)/include |
235 | CFLAGS += -I$(srctree)/tools/include/ | ||
243 | CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi | 236 | CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi |
244 | CFLAGS += -I$(srctree)/arch/$(ARCH)/include | 237 | CFLAGS += -I$(srctree)/arch/$(ARCH)/include |
245 | CFLAGS += -I$(srctree)/include/uapi | 238 | CFLAGS += -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 | |||
2 | uname_M := $(shell uname -m 2>/dev/null || echo not) | ||
3 | |||
4 | ARCH ?= $(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 | ||
11 | ifeq ($(ARCH),i386) | ||
12 | override ARCH := x86 | ||
13 | endif | ||
14 | |||
15 | ifeq ($(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 | ||
22 | endif | ||
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 | |||
3 | int 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; |
541 | out_err: | 541 | out_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) | |||
142 | out_err: | 142 | out_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 @@ | |||
1 | PERF := . | 1 | PERF := . |
2 | MK := Makefile | 2 | MK := Makefile |
3 | 3 | ||
4 | include 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 | ||
8 | ifeq ($(IS_X86_64),1) | ||
9 | lib = lib64 | ||
10 | else | ||
11 | lib = lib | ||
12 | endif | ||
13 | |||
4 | has = $(shell which $1 2>/dev/null) | 14 | has = $(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 | |||
118 | installed_files_bin += etc/bash_completion.d/perf | 128 | installed_files_bin += etc/bash_completion.d/perf |
119 | installed_files_bin += libexec/perf-core/perf-archive | 129 | installed_files_bin += libexec/perf-core/perf-archive |
120 | 130 | ||
121 | installed_files_plugins := lib64/traceevent/plugins/plugin_cfg80211.so | 131 | installed_files_plugins := $(lib)/traceevent/plugins/plugin_cfg80211.so |
122 | installed_files_plugins += lib64/traceevent/plugins/plugin_scsi.so | 132 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_scsi.so |
123 | installed_files_plugins += lib64/traceevent/plugins/plugin_xen.so | 133 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_xen.so |
124 | installed_files_plugins += lib64/traceevent/plugins/plugin_function.so | 134 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_function.so |
125 | installed_files_plugins += lib64/traceevent/plugins/plugin_sched_switch.so | 135 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_sched_switch.so |
126 | installed_files_plugins += lib64/traceevent/plugins/plugin_mac80211.so | 136 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_mac80211.so |
127 | installed_files_plugins += lib64/traceevent/plugins/plugin_kvm.so | 137 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_kvm.so |
128 | installed_files_plugins += lib64/traceevent/plugins/plugin_kmem.so | 138 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_kmem.so |
129 | installed_files_plugins += lib64/traceevent/plugins/plugin_hrtimer.so | 139 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_hrtimer.so |
130 | installed_files_plugins += lib64/traceevent/plugins/plugin_jbd2.so | 140 | installed_files_plugins += $(lib)/traceevent/plugins/plugin_jbd2.so |
131 | 141 | ||
132 | installed_files_all := $(installed_files_bin) | 142 | installed_files_all := $(installed_files_bin) |
133 | installed_files_all += $(installed_files_plugins) | 143 | installed_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 | ||
209 | all: $(run) $(run_O) | 219 | tarpkg: |
220 | @cmd="$(PERF)/tests/perf-targz-src-pkg $(PERF)"; \ | ||
221 | echo "- $@: $$cmd" && echo $$cmd > $@ && \ | ||
222 | ( eval $$cmd ) >> $@ 2>&1 | ||
223 | |||
224 | |||
225 | all: $(run) $(run_O) tarpkg | ||
210 | @echo OK | 226 | @echo OK |
211 | 227 | ||
212 | out: $(run_O) | 228 | out: $(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 | ||
139 | out_munmap: | 139 | out_delete_evlist: |
140 | perf_evlist__munmap(evlist); | ||
141 | out_close_fd: | ||
142 | for (i = 0; i < nsyscalls; ++i) | ||
143 | perf_evsel__close_fd(evsels[i], 1, threads->nr); | ||
144 | out_free_evlist: | ||
145 | perf_evlist__delete(evlist); | 140 | perf_evlist__delete(evlist); |
141 | cpus = NULL; | ||
142 | threads = NULL; | ||
146 | out_free_cpus: | 143 | out_free_cpus: |
147 | cpu_map__delete(cpus); | 144 | cpu_map__delete(cpus); |
148 | out_free_threads: | 145 | out_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 | } |
111 | out_ok: | 111 | out_ok: |
112 | err = 0; | 112 | err = 0; |
113 | out_munmap: | ||
114 | perf_evlist__munmap(evlist); | ||
115 | out_close_evlist: | ||
116 | perf_evlist__close(evlist); | ||
117 | out_delete_maps: | ||
118 | perf_evlist__delete_maps(evlist); | ||
119 | out_delete_evlist: | 113 | out_delete_evlist: |
120 | perf_evlist__delete(evlist); | 114 | perf_evlist__delete(evlist); |
121 | out: | 115 | out: |
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 | } |
306 | out_err: | ||
307 | perf_evlist__munmap(evlist); | ||
308 | out_close_evlist: | ||
309 | perf_evlist__close(evlist); | ||
310 | out_delete_maps: | ||
311 | perf_evlist__delete_maps(evlist); | ||
312 | out_delete_evlist: | 305 | out_delete_evlist: |
313 | perf_evlist__delete(evlist); | 306 | perf_evlist__delete(evlist); |
314 | out: | 307 | out: |
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 | |||
10 | PERF=$1 | ||
11 | cd ${PERF}/../.. | ||
12 | make perf-targz-src-pkg > /dev/null | ||
13 | TARBALL=$(ls -rt perf-*.tar.gz) | ||
14 | TMP_DEST=$(mktemp -d) | ||
15 | tar xf ${TARBALL} -C $TMP_DEST | ||
16 | rm -f ${TARBALL} | ||
17 | cd - > /dev/null | ||
18 | make -C $TMP_DEST/perf*/tools/perf > /dev/null 2>&1 | ||
19 | RC=$? | ||
20 | rm -rf ${TMP_DEST} | ||
21 | exit $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: | |||
166 | out_err: | 166 | out_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 | ||
108 | out_unmap_evlist: | 108 | out_delete_evlist: |
109 | perf_evlist__munmap(evlist); | ||
110 | out_close_evlist: | ||
111 | perf_evlist__close(evlist); | ||
112 | out_delete_maps: | ||
113 | perf_evlist__delete_maps(evlist); | ||
114 | out_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 @@ | |||
9 | static int exited; | 9 | static int exited; |
10 | static int nr_exit; | 10 | static int nr_exit; |
11 | 11 | ||
12 | static void sig_handler(int sig) | 12 | static 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 | */ | ||
21 | static 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); | 115 | out_delete_evlist: |
107 | out_close_evlist: | ||
108 | perf_evlist__close(evlist); | ||
109 | out_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 | ||
5 | int perf_use_color_default = -1; | 6 | int 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 | ||
322 | int 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 | |||
321 | int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...) | 328 | int 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, ...); | |||
39 | int color_snprintf(char *bf, size_t size, const char *color, const char *fmt, ...); | 39 | int color_snprintf(char *bf, size_t size, const char *color, const char *fmt, ...); |
40 | int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...); | 40 | int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...); |
41 | int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf); | 41 | int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf); |
42 | int value_color_snprintf(char *bf, size_t size, const char *fmt, double value); | ||
42 | int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...); | 43 | int percent_color_snprintf(char *bf, size_t size, const char *fmt, ...); |
43 | int percent_color_fprintf(FILE *fp, const char *fmt, double percent); | 44 | int percent_color_fprintf(FILE *fp, const char *fmt, double percent); |
44 | const char *get_percent_color(double percent); | 45 | const 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 | ||
178 | static int perf_event__synthesize_mmap_events(struct perf_tool *tool, | 178 | int 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 | ||
269 | int 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 | |||
269 | size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); | 276 | size_t perf_event__fprintf_comm(union perf_event *event, FILE *fp); |
270 | size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); | 277 | size_t perf_event__fprintf_mmap(union perf_event *event, FILE *fp); |
271 | size_t perf_event__fprintf_mmap2(union perf_event *event, FILE *fp); | 278 | size_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 | ||
108 | void perf_evlist__delete(struct perf_evlist *evlist) | 108 | void 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 | ||
203 | out_delete_partial_list: | 209 | out_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 | ||
836 | void 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 | |||
844 | int perf_evlist__apply_filters(struct perf_evlist *evlist) | 845 | int 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 | ||
1030 | int perf_evlist__prepare_workload(struct perf_evlist *evlist, struct target *target, | 1031 | int 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); | |||
103 | int perf_evlist__prepare_workload(struct perf_evlist *evlist, | 103 | int 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)); | ||
107 | int perf_evlist__start_workload(struct perf_evlist *evlist); | 108 | int perf_evlist__start_workload(struct perf_evlist *evlist); |
108 | 109 | ||
109 | int perf_evlist__parse_mmap_pages(const struct option *opt, | 110 | int 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 | ||
136 | int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target); | 137 | int perf_evlist__create_maps(struct perf_evlist *evlist, struct target *target); |
137 | void perf_evlist__delete_maps(struct perf_evlist *evlist); | ||
138 | int perf_evlist__apply_filters(struct perf_evlist *evlist); | 138 | int perf_evlist__apply_filters(struct perf_evlist *evlist); |
139 | 139 | ||
140 | void __perf_evlist__set_leader(struct list_head *list); | 140 | void __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); | |||
196 | void perf_evlist__to_front(struct perf_evlist *evlist, | 196 | void 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 | ||
92 | struct perf_header { | 92 | struct perf_header { |
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 | */ |
510 | static int pmu_config_term(struct list_head *formats, | 510 | static 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 */ |
176 | static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, | 177 | static 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 | ||
221 | static int init_user_exec(void) | 223 | static 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 | ||
751 | static int try_to_find_probe_trace_events(struct perf_probe_event *pev, | 753 | static 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 | ||