Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull perf fixes from Ingo Molnar.

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
perf: Fix perf_event_for_each() to use sibling
perf symbols: Read plt symbols from proper symtab_type binary
tracing: Fix stacktrace of latency tracers (irqsoff and friends)
perf tools: Add 'G' and 'H' modifiers to event parsing
tracing: Fix regression with tracing_on
perf tools: Drop CROSS_COMPILE from flex and bison calls
perf report: Fix crash showing warning related to kernel maps
tracing: Fix build breakage without CONFIG_PERF_EVENTS (again)

+64 -21
+1 -1
kernel/events/core.c
··· 3183 3183 perf_event_for_each_child(event, func); 3184 3184 func(event); 3185 3185 list_for_each_entry(sibling, &event->sibling_list, group_entry) 3186 - perf_event_for_each_child(event, func); 3186 + perf_event_for_each_child(sibling, func); 3187 3187 mutex_unlock(&ctx->mutex); 3188 3188 } 3189 3189
+5 -3
kernel/trace/trace.c
··· 4629 4629 rb_simple_read(struct file *filp, char __user *ubuf, 4630 4630 size_t cnt, loff_t *ppos) 4631 4631 { 4632 - struct ring_buffer *buffer = filp->private_data; 4632 + struct trace_array *tr = filp->private_data; 4633 + struct ring_buffer *buffer = tr->buffer; 4633 4634 char buf[64]; 4634 4635 int r; 4635 4636 ··· 4648 4647 rb_simple_write(struct file *filp, const char __user *ubuf, 4649 4648 size_t cnt, loff_t *ppos) 4650 4649 { 4651 - struct ring_buffer *buffer = filp->private_data; 4650 + struct trace_array *tr = filp->private_data; 4651 + struct ring_buffer *buffer = tr->buffer; 4652 4652 unsigned long val; 4653 4653 int ret; 4654 4654 ··· 4736 4734 &trace_clock_fops); 4737 4735 4738 4736 trace_create_file("tracing_on", 0644, d_tracer, 4739 - global_trace.buffer, &rb_simple_fops); 4737 + &global_trace, &rb_simple_fops); 4740 4738 4741 4739 #ifdef CONFIG_DYNAMIC_FTRACE 4742 4740 trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
+2 -2
kernel/trace/trace.h
··· 836 836 filter) 837 837 #include "trace_entries.h" 838 838 839 - #ifdef CONFIG_FUNCTION_TRACER 839 + #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_FUNCTION_TRACER) 840 840 int perf_ftrace_event_register(struct ftrace_event_call *call, 841 841 enum trace_reg type, void *data); 842 842 #else 843 843 #define perf_ftrace_event_register NULL 844 - #endif /* CONFIG_FUNCTION_TRACER */ 844 + #endif 845 845 846 846 #endif /* _LINUX_KERNEL_TRACE_H */
+5
kernel/trace/trace_output.c
··· 652 652 { 653 653 u64 next_ts; 654 654 int ret; 655 + /* trace_find_next_entry will reset ent_size */ 656 + int ent_size = iter->ent_size; 655 657 struct trace_seq *s = &iter->seq; 656 658 struct trace_entry *entry = iter->ent, 657 659 *next_entry = trace_find_next_entry(iter, NULL, ··· 661 659 unsigned long verbose = (trace_flags & TRACE_ITER_VERBOSE); 662 660 unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start); 663 661 unsigned long rel_usecs; 662 + 663 + /* Restore the original ent_size */ 664 + iter->ent_size = ent_size; 664 665 665 666 if (!next_entry) 666 667 next_ts = iter->ts;
+2 -2
tools/perf/Makefile
··· 234 234 235 235 export PERL_PATH 236 236 237 - FLEX = $(CROSS_COMPILE)flex 238 - BISON= $(CROSS_COMPILE)bison 237 + FLEX = flex 238 + BISON= bison 239 239 240 240 $(OUTPUT)util/parse-events-flex.c: util/parse-events.l 241 241 $(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c
+12 -5
tools/perf/builtin-report.c
··· 374 374 (kernel_map->dso->hit && 375 375 (kernel_kmap->ref_reloc_sym == NULL || 376 376 kernel_kmap->ref_reloc_sym->addr == 0))) { 377 - const struct dso *kdso = kernel_map->dso; 377 + const char *desc = 378 + "As no suitable kallsyms nor vmlinux was found, kernel samples\n" 379 + "can't be resolved."; 380 + 381 + if (kernel_map) { 382 + const struct dso *kdso = kernel_map->dso; 383 + if (!RB_EMPTY_ROOT(&kdso->symbols[MAP__FUNCTION])) { 384 + desc = "If some relocation was applied (e.g. " 385 + "kexec) symbols may be misresolved."; 386 + } 387 + } 378 388 379 389 ui__warning( 380 390 "Kernel address maps (/proc/{kallsyms,modules}) were restricted.\n\n" 381 391 "Check /proc/sys/kernel/kptr_restrict before running 'perf record'.\n\n%s\n\n" 382 392 "Samples in kernel modules can't be resolved as well.\n\n", 383 - RB_EMPTY_ROOT(&kdso->symbols[MAP__FUNCTION]) ? 384 - "As no suitable kallsyms nor vmlinux was found, kernel samples\n" 385 - "can't be resolved." : 386 - "If some relocation was applied (e.g. kexec) symbols may be misresolved."); 393 + desc); 387 394 } 388 395 389 396 if (dump_trace) {
+30
tools/perf/builtin-test.c
··· 851 851 return test__checkevent_symbolic_name(evlist); 852 852 } 853 853 854 + static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist) 855 + { 856 + struct perf_evsel *evsel = list_entry(evlist->entries.next, 857 + struct perf_evsel, node); 858 + 859 + TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest); 860 + TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host); 861 + 862 + return test__checkevent_symbolic_name(evlist); 863 + } 864 + 865 + static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist) 866 + { 867 + struct perf_evsel *evsel = list_entry(evlist->entries.next, 868 + struct perf_evsel, node); 869 + 870 + TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest); 871 + TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); 872 + 873 + return test__checkevent_symbolic_name(evlist); 874 + } 875 + 854 876 static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist) 855 877 { 856 878 struct perf_evsel *evsel = list_entry(evlist->entries.next, ··· 1112 1090 { 1113 1091 .name = "r1,syscalls:sys_enter_open:k,1:1:hp", 1114 1092 .check = test__checkevent_list, 1093 + }, 1094 + { 1095 + .name = "instructions:G", 1096 + .check = test__checkevent_exclude_host_modifier, 1097 + }, 1098 + { 1099 + .name = "instructions:H", 1100 + .check = test__checkevent_exclude_guest_modifier, 1115 1101 }, 1116 1102 }; 1117 1103
+1 -1
tools/perf/util/parse-events.l
··· 54 54 num_hex 0x[a-fA-F0-9]+ 55 55 num_raw_hex [a-fA-F0-9]+ 56 56 name [a-zA-Z_*?][a-zA-Z0-9_*?]* 57 - modifier_event [ukhp]{1,5} 57 + modifier_event [ukhpGH]{1,8} 58 58 modifier_bp [rwx] 59 59 60 60 %%
+6 -7
tools/perf/util/symbol.c
··· 977 977 * And always look at the original dso, not at debuginfo packages, that 978 978 * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS). 979 979 */ 980 - static int dso__synthesize_plt_symbols(struct dso *dso, struct map *map, 981 - symbol_filter_t filter) 980 + static int 981 + dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map, 982 + symbol_filter_t filter) 982 983 { 983 984 uint32_t nr_rel_entries, idx; 984 985 GElf_Sym sym; ··· 994 993 char sympltname[1024]; 995 994 Elf *elf; 996 995 int nr = 0, symidx, fd, err = 0; 997 - char name[PATH_MAX]; 998 996 999 - snprintf(name, sizeof(name), "%s%s", 1000 - symbol_conf.symfs, dso->long_name); 1001 997 fd = open(name, O_RDONLY); 1002 998 if (fd < 0) 1003 999 goto out; ··· 1701 1703 continue; 1702 1704 1703 1705 if (ret > 0) { 1704 - int nr_plt = dso__synthesize_plt_symbols(dso, map, 1705 - filter); 1706 + int nr_plt; 1707 + 1708 + nr_plt = dso__synthesize_plt_symbols(dso, name, map, filter); 1706 1709 if (nr_plt > 0) 1707 1710 ret += nr_plt; 1708 1711 break;