Merge tag 'perf-urgent-for-mingo-4.16-20180306' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent

Pull perf/urgent fixes from Arnaldo Carvalho de Melo:

- Be more robust when drawing arrows in the annotation TUI, avoiding a
segfault when jump instructions have as a target addresses in functions
other that the one currently being annotated. The full fix will come in
the following days, when jumping to other functions will work as call
instructions (Arnaldo Carvalho de Melo)

- Prevent auxtrace_queues__process_index() from queuing AUX area data for
decoding when the --no-itrace option has been used (Adrian Hunter)

- Sync copy of kvm UAPI headers and x86's cpufeatures.h (Arnaldo Carvalho de Melo)

- Fix 'perf stat' CSV output format for non-supported counters (Ilya Pronin)

- Fix crash in 'perf record|perf report' pipe mode (Jiri Olsa)

- Fix annoying 'perf top' overwrite fallback message on older kernels (Kan Liang)

- Fix the usage on the 'perf kallsyms' man page (Sangwon Hong)

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>

Changed files
+61 -15
tools
arch
x86
include
include
uapi
linux
perf
+1
tools/arch/x86/include/asm/cpufeatures.h
··· 213 #define X86_FEATURE_SEV ( 7*32+20) /* AMD Secure Encrypted Virtualization */ 214 215 #define X86_FEATURE_USE_IBPB ( 7*32+21) /* "" Indirect Branch Prediction Barrier enabled */ 216 217 /* Virtualization flags: Linux defined, word 8 */ 218 #define X86_FEATURE_TPR_SHADOW ( 8*32+ 0) /* Intel TPR Shadow */
··· 213 #define X86_FEATURE_SEV ( 7*32+20) /* AMD Secure Encrypted Virtualization */ 214 215 #define X86_FEATURE_USE_IBPB ( 7*32+21) /* "" Indirect Branch Prediction Barrier enabled */ 216 + #define X86_FEATURE_USE_IBRS_FW ( 7*32+22) /* "" Use IBRS during runtime firmware calls */ 217 218 /* Virtualization flags: Linux defined, word 8 */ 219 #define X86_FEATURE_TPR_SHADOW ( 8*32+ 0) /* Intel TPR Shadow */
+2
tools/include/uapi/linux/kvm.h
··· 761 #define KVM_TRACE_PAUSE __KVM_DEPRECATED_MAIN_0x07 762 #define KVM_TRACE_DISABLE __KVM_DEPRECATED_MAIN_0x08 763 #define KVM_GET_EMULATED_CPUID _IOWR(KVMIO, 0x09, struct kvm_cpuid2) 764 765 /* 766 * Extension capability list. ··· 935 #define KVM_CAP_S390_AIS_MIGRATION 150 936 #define KVM_CAP_PPC_GET_CPU_CHAR 151 937 #define KVM_CAP_S390_BPB 152 938 939 #ifdef KVM_CAP_IRQ_ROUTING 940
··· 761 #define KVM_TRACE_PAUSE __KVM_DEPRECATED_MAIN_0x07 762 #define KVM_TRACE_DISABLE __KVM_DEPRECATED_MAIN_0x08 763 #define KVM_GET_EMULATED_CPUID _IOWR(KVMIO, 0x09, struct kvm_cpuid2) 764 + #define KVM_GET_MSR_FEATURE_INDEX_LIST _IOWR(KVMIO, 0x0a, struct kvm_msr_list) 765 766 /* 767 * Extension capability list. ··· 934 #define KVM_CAP_S390_AIS_MIGRATION 150 935 #define KVM_CAP_PPC_GET_CPU_CHAR 151 936 #define KVM_CAP_S390_BPB 152 937 + #define KVM_CAP_GET_MSR_FEATURES 153 938 939 #ifdef KVM_CAP_IRQ_ROUTING 940
+1 -1
tools/perf/Documentation/perf-kallsyms.txt
··· 8 SYNOPSIS 9 -------- 10 [verse] 11 - 'perf kallsyms <options> symbol_name[,symbol_name...]' 12 13 DESCRIPTION 14 -----------
··· 8 SYNOPSIS 9 -------- 10 [verse] 11 + 'perf kallsyms' [<options>] symbol_name[,symbol_name...] 12 13 DESCRIPTION 14 -----------
+9
tools/perf/builtin-record.c
··· 881 } 882 } 883 884 if (record__open(rec) != 0) { 885 err = -1; 886 goto out_child;
··· 881 } 882 } 883 884 + /* 885 + * If we have just single event and are sending data 886 + * through pipe, we need to force the ids allocation, 887 + * because we synthesize event name through the pipe 888 + * and need the id for that. 889 + */ 890 + if (data->is_pipe && rec->evlist->nr_entries == 1) 891 + rec->opts.sample_id = true; 892 + 893 if (record__open(rec) != 0) { 894 err = -1; 895 goto out_child;
+1 -1
tools/perf/builtin-stat.c
··· 917 char buf[64], *vals, *ends; 918 919 if (unit == NULL || fmt == NULL) { 920 - fprintf(out, "%s%s%s%s", csv_sep, csv_sep, csv_sep, csv_sep); 921 return; 922 } 923 snprintf(buf, sizeof(buf), fmt, val);
··· 917 char buf[64], *vals, *ends; 918 919 if (unit == NULL || fmt == NULL) { 920 + fprintf(out, "%s%s", csv_sep, csv_sep); 921 return; 922 } 923 snprintf(buf, sizeof(buf), fmt, val);
+1 -1
tools/perf/builtin-top.c
··· 991 evlist__for_each_entry(evlist, counter) 992 counter->attr.write_backward = false; 993 opts->overwrite = false; 994 - ui__warning("fall back to non-overwrite mode\n"); 995 return 1; 996 } 997
··· 991 evlist__for_each_entry(evlist, counter) 992 counter->attr.write_backward = false; 993 opts->overwrite = false; 994 + pr_debug2("fall back to non-overwrite mode\n"); 995 return 1; 996 } 997
+1
tools/perf/perf.h
··· 61 bool tail_synthesize; 62 bool overwrite; 63 bool ignore_missing_thread; 64 unsigned int freq; 65 unsigned int mmap_pages; 66 unsigned int auxtrace_mmap_pages;
··· 61 bool tail_synthesize; 62 bool overwrite; 63 bool ignore_missing_thread; 64 + bool sample_id; 65 unsigned int freq; 66 unsigned int mmap_pages; 67 unsigned int auxtrace_mmap_pages;
+25
tools/perf/ui/browsers/annotate.c
··· 327 if (!disasm_line__is_valid_jump(cursor, sym)) 328 return; 329 330 target = ab->offsets[cursor->ops.target.offset]; 331 332 bcursor = browser_line(&cursor->al); 333 btarget = browser_line(target);
··· 327 if (!disasm_line__is_valid_jump(cursor, sym)) 328 return; 329 330 + /* 331 + * This first was seen with a gcc function, _cpp_lex_token, that 332 + * has the usual jumps: 333 + * 334 + * │1159e6c: ↓ jne 115aa32 <_cpp_lex_token@@Base+0xf92> 335 + * 336 + * I.e. jumps to a label inside that function (_cpp_lex_token), and 337 + * those works, but also this kind: 338 + * 339 + * │1159e8b: ↓ jne c469be <cpp_named_operator2name@@Base+0xa72> 340 + * 341 + * I.e. jumps to another function, outside _cpp_lex_token, which 342 + * are not being correctly handled generating as a side effect references 343 + * to ab->offset[] entries that are set to NULL, so to make this code 344 + * more robust, check that here. 345 + * 346 + * A proper fix for will be put in place, looking at the function 347 + * name right after the '<' token and probably treating this like a 348 + * 'call' instruction. 349 + */ 350 target = ab->offsets[cursor->ops.target.offset]; 351 + if (target == NULL) { 352 + ui_helpline__printf("WARN: jump target inconsistency, press 'o', ab->offsets[%#x] = NULL\n", 353 + cursor->ops.target.offset); 354 + return; 355 + } 356 357 bcursor = browser_line(&cursor->al); 358 btarget = browser_line(target);
+9 -6
tools/perf/util/auxtrace.c
··· 60 #include "sane_ctype.h" 61 #include "symbol/kallsyms.h" 62 63 int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, 64 struct auxtrace_mmap_params *mp, 65 void *userpg, int fd) ··· 768 size_t i; 769 int err; 770 771 list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) { 772 for (i = 0; i < auxtrace_index->nr; i++) { 773 ent = &auxtrace_index->entries[i]; ··· 899 out_free: 900 free(ev); 901 return err; 902 - } 903 - 904 - static bool auxtrace__dont_decode(struct perf_session *session) 905 - { 906 - return !session->itrace_synth_opts || 907 - session->itrace_synth_opts->dont_decode; 908 } 909 910 int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused,
··· 60 #include "sane_ctype.h" 61 #include "symbol/kallsyms.h" 62 63 + static bool auxtrace__dont_decode(struct perf_session *session) 64 + { 65 + return !session->itrace_synth_opts || 66 + session->itrace_synth_opts->dont_decode; 67 + } 68 + 69 int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, 70 struct auxtrace_mmap_params *mp, 71 void *userpg, int fd) ··· 762 size_t i; 763 int err; 764 765 + if (auxtrace__dont_decode(session)) 766 + return 0; 767 + 768 list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) { 769 for (i = 0; i < auxtrace_index->nr; i++) { 770 ent = &auxtrace_index->entries[i]; ··· 890 out_free: 891 free(ev); 892 return err; 893 } 894 895 int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused,
+6 -2
tools/perf/util/record.c
··· 137 struct perf_evsel *evsel; 138 bool use_sample_identifier = false; 139 bool use_comm_exec; 140 141 /* 142 * Set the evsel leader links before we configure attributes, ··· 164 * match the id. 165 */ 166 use_sample_identifier = perf_can_sample_identifier(); 167 - evlist__for_each_entry(evlist, evsel) 168 - perf_evsel__set_sample_id(evsel, use_sample_identifier); 169 } else if (evlist->nr_entries > 1) { 170 struct perf_evsel *first = perf_evlist__first(evlist); 171 ··· 174 use_sample_identifier = perf_can_sample_identifier(); 175 break; 176 } 177 evlist__for_each_entry(evlist, evsel) 178 perf_evsel__set_sample_id(evsel, use_sample_identifier); 179 }
··· 137 struct perf_evsel *evsel; 138 bool use_sample_identifier = false; 139 bool use_comm_exec; 140 + bool sample_id = opts->sample_id; 141 142 /* 143 * Set the evsel leader links before we configure attributes, ··· 163 * match the id. 164 */ 165 use_sample_identifier = perf_can_sample_identifier(); 166 + sample_id = true; 167 } else if (evlist->nr_entries > 1) { 168 struct perf_evsel *first = perf_evlist__first(evlist); 169 ··· 174 use_sample_identifier = perf_can_sample_identifier(); 175 break; 176 } 177 + sample_id = true; 178 + } 179 + 180 + if (sample_id) { 181 evlist__for_each_entry(evlist, evsel) 182 perf_evsel__set_sample_id(evsel, use_sample_identifier); 183 }
+5 -4
tools/perf/util/trigger.h
··· 12 * States and transits: 13 * 14 * 15 - * OFF--(on)--> READY --(hit)--> HIT 16 * ^ | 17 * | (ready) 18 * | | ··· 27 volatile enum { 28 TRIGGER_ERROR = -2, 29 TRIGGER_OFF = -1, 30 - TRIGGER_READY = 0, 31 - TRIGGER_HIT = 1, 32 } state; 33 const char *name; 34 }; ··· 51 static inline void trigger_on(struct trigger *t) 52 { 53 TRIGGER_WARN_ONCE(t, TRIGGER_OFF); 54 - t->state = TRIGGER_READY; 55 } 56 57 static inline void trigger_ready(struct trigger *t)
··· 12 * States and transits: 13 * 14 * 15 + * OFF--> ON --> READY --(hit)--> HIT 16 * ^ | 17 * | (ready) 18 * | | ··· 27 volatile enum { 28 TRIGGER_ERROR = -2, 29 TRIGGER_OFF = -1, 30 + TRIGGER_ON = 0, 31 + TRIGGER_READY = 1, 32 + TRIGGER_HIT = 2, 33 } state; 34 const char *name; 35 }; ··· 50 static inline void trigger_on(struct trigger *t) 51 { 52 TRIGGER_WARN_ONCE(t, TRIGGER_OFF); 53 + t->state = TRIGGER_ON; 54 } 55 56 static inline void trigger_ready(struct trigger *t)