Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Ingo Molnar:
"Tooling changes only: it includes the ARM tooling fixlets, various
other fixes, smaller updates, minor cleanups"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf record: Add an option to force per-cpu mmaps
perf probe: Add '--demangle'/'--no-demangle'
perf ui browser: Fix segfault caused by off by one handling END key
perf symbols: Limit max callchain using max_stack on DWARF unwinding too
perf evsel: Introduce perf_evsel__prev() method
perf tools: Use perf_evlist__{first,last}, perf_evsel__next
perf tools: Synthesize anon MMAP records again
perf top: Add missing newline if the 'uid' is invalid
perf tools: Remove trivial extra semincolon
perf trace: Tweak summary output
tools/perf/build: Fix feature-libunwind-debug-frame handling
tools/perf/build: Fix timerfd feature check

+63 -38
+6
tools/perf/Documentation/perf-record.txt
··· 201 201 --transaction:: 202 202 Record transaction flags for transaction related events. 203 203 204 + --force-per-cpu:: 205 + Force the use of per-cpu mmaps. By default, when tasks are specified (i.e. -p, 206 + -t or -u options) per-thread mmaps are created. This option overrides that and 207 + forces per-cpu mmaps. A side-effect of that is that inheritance is 208 + automatically enabled. Add the -i option also to disable inheritance. 209 + 204 210 SEE ALSO 205 211 -------- 206 212 linkperf:perf-stat[1], linkperf:perf-list[1]
+2
tools/perf/builtin-probe.c
··· 325 325 opt_set_filter), 326 326 OPT_CALLBACK('x', "exec", NULL, "executable|path", 327 327 "target executable name or path", opt_set_target), 328 + OPT_BOOLEAN(0, "demangle", &symbol_conf.demangle, 329 + "Disable symbol demangling"), 328 330 OPT_END() 329 331 }; 330 332 int ret;
+2
tools/perf/builtin-record.c
··· 888 888 "sample by weight (on special events only)"), 889 889 OPT_BOOLEAN(0, "transaction", &record.opts.sample_transaction, 890 890 "sample transaction flags (special events only)"), 891 + OPT_BOOLEAN(0, "force-per-cpu", &record.opts.target.force_per_cpu, 892 + "force the use of per-cpu mmaps"), 891 893 OPT_END() 892 894 }; 893 895
+2 -2
tools/perf/builtin-top.c
··· 1172 1172 status = target__validate(target); 1173 1173 if (status) { 1174 1174 target__strerror(target, status, errbuf, BUFSIZ); 1175 - ui__warning("%s", errbuf); 1175 + ui__warning("%s\n", errbuf); 1176 1176 } 1177 1177 1178 1178 status = target__parse_uid(target); ··· 1180 1180 int saved_errno = errno; 1181 1181 1182 1182 target__strerror(target, status, errbuf, BUFSIZ); 1183 - ui__error("%s", errbuf); 1183 + ui__error("%s\n", errbuf); 1184 1184 1185 1185 status = -saved_errno; 1186 1186 goto out_delete_evlist;
+5 -5
tools/perf/builtin-trace.c
··· 2112 2112 2113 2113 printed += fprintf(fp, "\n"); 2114 2114 2115 - printed += fprintf(fp, " msec/call\n"); 2116 - printed += fprintf(fp, " syscall calls min avg max stddev\n"); 2117 - printed += fprintf(fp, " --------------- -------- -------- -------- -------- ------\n"); 2115 + printed += fprintf(fp, " syscall calls min avg max stddev\n"); 2116 + printed += fprintf(fp, " (msec) (msec) (msec) (%%)\n"); 2117 + printed += fprintf(fp, " --------------- -------- --------- --------- --------- ------\n"); 2118 2118 2119 2119 /* each int_node is a syscall */ 2120 2120 while (inode) { ··· 2131 2131 2132 2132 sc = &trace->syscalls.table[inode->i]; 2133 2133 printed += fprintf(fp, " %-15s", sc->name); 2134 - printed += fprintf(fp, " %8" PRIu64 " %8.3f %8.3f", 2134 + printed += fprintf(fp, " %8" PRIu64 " %9.3f %9.3f", 2135 2135 n, min, avg); 2136 - printed += fprintf(fp, " %8.3f %6.2f\n", max, pct); 2136 + printed += fprintf(fp, " %9.3f %9.2f%%\n", max, pct); 2137 2137 } 2138 2138 2139 2139 inode = intlist__next(inode);
+10 -4
tools/perf/config/Makefile
··· 142 142 libunwind \ 143 143 on-exit \ 144 144 stackprotector \ 145 - stackprotector-all 145 + stackprotector-all \ 146 + timerfd 146 147 147 148 # 148 149 # So here we detect whether test-all was rebuilt, to be able ··· 329 328 msg := $(warning No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 1.1); 330 329 NO_LIBUNWIND := 1 331 330 else 332 - ifneq ($(feature-libunwind-debug-frame), 1) 333 - msg := $(warning No debug_frame support found in libunwind); 331 + ifeq ($(ARCH),arm) 332 + $(call feature_check,libunwind-debug-frame) 333 + ifneq ($(feature-libunwind-debug-frame), 1) 334 + msg := $(warning No debug_frame support found in libunwind); 335 + CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME 336 + endif 337 + else 338 + # non-ARM has no dwarf_find_debug_frame() function: 334 339 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME 335 340 endif 336 341 endif ··· 412 405 endif 413 406 endif 414 407 415 - $(call feature_check,timerfd) 416 408 ifeq ($(feature-timerfd), 1) 417 409 CFLAGS += -DHAVE_TIMERFD_SUPPORT 418 410 else
+3
tools/perf/config/feature-checks/Makefile
··· 76 76 test-libunwind: 77 77 $(BUILD) $(LIBUNWIND_LIBS) -lelf 78 78 79 + test-libunwind-debug-frame: 80 + $(BUILD) $(LIBUNWIND_LIBS) -lelf 81 + 79 82 test-libaudit: 80 83 $(BUILD) -laudit 81 84
-4
tools/perf/config/feature-checks/test-all.c
··· 49 49 # include "test-libunwind.c" 50 50 #undef main 51 51 52 - #define main main_test_libunwind_debug_frame 53 - # include "test-libunwind-debug-frame.c" 54 - #undef main 55 - 56 52 #define main main_test_libaudit 57 53 # include "test-libaudit.c" 58 54 #undef main
+1 -2
tools/perf/tests/parse-events.c
··· 441 441 442 442 static int test__checkevent_pmu_events(struct perf_evlist *evlist) 443 443 { 444 - struct perf_evsel *evsel; 444 + struct perf_evsel *evsel = perf_evlist__first(evlist); 445 445 446 - evsel = list_entry(evlist->entries.next, struct perf_evsel, node); 447 446 TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); 448 447 TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type); 449 448 TEST_ASSERT_VAL("wrong exclude_user",
+2 -2
tools/perf/ui/browser.c
··· 569 569 browser->top = browser->top + browser->top_idx + offset; 570 570 break; 571 571 case SEEK_END: 572 - browser->top = browser->top + browser->nr_entries + offset; 572 + browser->top = browser->top + browser->nr_entries - 1 + offset; 573 573 break; 574 574 default: 575 575 return; ··· 680 680 if (end >= browser->top_idx + browser->height) 681 681 end_row = browser->height - 1; 682 682 else 683 - end_row = end - browser->top_idx;; 683 + end_row = end - browser->top_idx; 684 684 685 685 ui_browser__gotorc(browser, row, column); 686 686 SLsmg_draw_vline(end_row - row + 1);
+5 -6
tools/perf/ui/browsers/hists.c
··· 1847 1847 switch (key) { 1848 1848 case K_TAB: 1849 1849 if (pos->node.next == &evlist->entries) 1850 - pos = list_entry(evlist->entries.next, struct perf_evsel, node); 1850 + pos = perf_evlist__first(evlist); 1851 1851 else 1852 - pos = list_entry(pos->node.next, struct perf_evsel, node); 1852 + pos = perf_evsel__next(pos); 1853 1853 goto browse_hists; 1854 1854 case K_UNTAB: 1855 1855 if (pos->node.prev == &evlist->entries) 1856 - pos = list_entry(evlist->entries.prev, struct perf_evsel, node); 1856 + pos = perf_evlist__last(evlist); 1857 1857 else 1858 - pos = list_entry(pos->node.prev, struct perf_evsel, node); 1858 + pos = perf_evsel__prev(pos); 1859 1859 goto browse_hists; 1860 1860 case K_ESC: 1861 1861 if (!ui_browser__dialog_yesno(&menu->b, ··· 1943 1943 1944 1944 single_entry: 1945 1945 if (nr_entries == 1) { 1946 - struct perf_evsel *first = list_entry(evlist->entries.next, 1947 - struct perf_evsel, node); 1946 + struct perf_evsel *first = perf_evlist__first(evlist); 1948 1947 const char *ev_name = perf_evsel__name(first); 1949 1948 1950 1949 return perf_evsel__hists_browse(first, nr_entries, help,
+4 -2
tools/perf/util/event.c
··· 209 209 &event->mmap.start, &event->mmap.len, prot, 210 210 &event->mmap.pgoff, 211 211 execname); 212 - 213 - if (n != 5) 212 + /* 213 + * Anon maps don't have the execname. 214 + */ 215 + if (n < 4) 214 216 continue; 215 217 /* 216 218 * Just like the kernel, see __perf_event_mmap in kernel/perf_event.c
+4 -2
tools/perf/util/evlist.c
··· 819 819 if (evlist->threads == NULL) 820 820 return -1; 821 821 822 - if (target__has_task(target)) 822 + if (target->force_per_cpu) 823 + evlist->cpus = cpu_map__new(target->cpu_list); 824 + else if (target__has_task(target)) 823 825 evlist->cpus = cpu_map__dummy_new(); 824 826 else if (!target__has_cpu(target) && !target->uses_mmap) 825 827 evlist->cpus = cpu_map__dummy_new(); ··· 1150 1148 perf_evsel__name(evsel)); 1151 1149 } 1152 1150 1153 - return printed + fprintf(fp, "\n");; 1151 + return printed + fprintf(fp, "\n"); 1154 1152 } 1155 1153 1156 1154 int perf_evlist__strerror_tp(struct perf_evlist *evlist __maybe_unused,
+2 -2
tools/perf/util/evsel.c
··· 645 645 } 646 646 } 647 647 648 - if (target__has_cpu(&opts->target)) 648 + if (target__has_cpu(&opts->target) || opts->target.force_per_cpu) 649 649 perf_evsel__set_sample_bit(evsel, CPU); 650 650 651 651 if (opts->period) ··· 653 653 654 654 if (!perf_missing_features.sample_id_all && 655 655 (opts->sample_time || !opts->no_inherit || 656 - target__has_cpu(&opts->target))) 656 + target__has_cpu(&opts->target) || opts->target.force_per_cpu)) 657 657 perf_evsel__set_sample_bit(evsel, TIME); 658 658 659 659 if (opts->raw_samples) {
+5
tools/perf/util/evsel.h
··· 279 279 return list_entry(evsel->node.next, struct perf_evsel, node); 280 280 } 281 281 282 + static inline struct perf_evsel *perf_evsel__prev(struct perf_evsel *evsel) 283 + { 284 + return list_entry(evsel->node.prev, struct perf_evsel, node); 285 + } 286 + 282 287 /** 283 288 * perf_evsel__is_group_leader - Return whether given evsel is a leader event 284 289 *
+1 -1
tools/perf/util/machine.c
··· 1368 1368 1369 1369 return unwind__get_entries(unwind_entry, &callchain_cursor, machine, 1370 1370 thread, evsel->attr.sample_regs_user, 1371 - sample); 1371 + sample, max_stack); 1372 1372 1373 1373 } 1374 1374
+1
tools/perf/util/target.h
··· 12 12 uid_t uid; 13 13 bool system_wide; 14 14 bool uses_mmap; 15 + bool force_per_cpu; 15 16 }; 16 17 17 18 enum target_errno {
+5 -4
tools/perf/util/unwind.c
··· 559 559 }; 560 560 561 561 static int get_entries(struct unwind_info *ui, unwind_entry_cb_t cb, 562 - void *arg) 562 + void *arg, int max_stack) 563 563 { 564 564 unw_addr_space_t addr_space; 565 565 unw_cursor_t c; ··· 575 575 if (ret) 576 576 display_error(ret); 577 577 578 - while (!ret && (unw_step(&c) > 0)) { 578 + while (!ret && (unw_step(&c) > 0) && max_stack--) { 579 579 unw_word_t ip; 580 580 581 581 unw_get_reg(&c, UNW_REG_IP, &ip); ··· 588 588 589 589 int unwind__get_entries(unwind_entry_cb_t cb, void *arg, 590 590 struct machine *machine, struct thread *thread, 591 - u64 sample_uregs, struct perf_sample *data) 591 + u64 sample_uregs, struct perf_sample *data, 592 + int max_stack) 592 593 { 593 594 unw_word_t ip; 594 595 struct unwind_info ui = { ··· 611 610 if (ret) 612 611 return -ENOMEM; 613 612 614 - return get_entries(&ui, cb, arg); 613 + return get_entries(&ui, cb, arg, max_stack); 615 614 }
+3 -2
tools/perf/util/unwind.h
··· 18 18 struct machine *machine, 19 19 struct thread *thread, 20 20 u64 sample_uregs, 21 - struct perf_sample *data); 21 + struct perf_sample *data, int max_stack); 22 22 int unwind__arch_reg_id(int regnum); 23 23 #else 24 24 static inline int ··· 27 27 struct machine *machine __maybe_unused, 28 28 struct thread *thread __maybe_unused, 29 29 u64 sample_uregs __maybe_unused, 30 - struct perf_sample *data __maybe_unused) 30 + struct perf_sample *data __maybe_unused, 31 + int max_stack __maybe_unused) 31 32 { 32 33 return 0; 33 34 }