perf/urgent fixes:

- 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>
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEELb9bqkb7Te0zijNb1lAW81NSqkAFAlqezgwACgkQ1lAW81NS
 qkA3dQ/+OS+80jYOg5I58midluhfiS0wsHGAq3vV1QHsWpQVUrId/aYsmTzuj72B
 IYm5hGuFOX/uk7IokEBjbuuJgTXWsuJBaBYr34J2lkpYrwS0PHaTxevbKSmHI5MT
 /tdWzh8AiZPvpwbbHebRrt6o3aHLtNOHRvH8PnufRYVbwe+83kbBPpmu6COMhA+o
 nX1dEImlmH5aPaN7z+xzTx94W+NXrX+rvz49/c/bsRQVjqfHb3KyxDKPwWD3BEly
 lyZ6mRsC8XE/7R8hnldmXQqbwTzMiCp87VTRzmaOhJqNotbZpXCXTPOBAx/Jv3Tu
 53FRVR1RjtXO179rdcDTM+kF2TRTze9eIF97h2VP0wgvpoE5g9NVNnFohzgTqTJL
 ETpe1y9xlB9KxNexK2Dh1auY7aeK/eP6xQ+xiy09HpcSmwnNU0dW/di98gL8+Z3N
 EfdAEB5ADqw+tSEvrcqK3USpb5hKyV2abR/+MtNl5CCLkOZX1AcpNkPiZHeGkq/9
 LRFVAPaz7i4/OOwGBgGKWAUlNG6AqdXjG+XwPCrDO70UumGAuvi0vDIgWIQXhRqR
 7JBNzMd8WEClQHRrQ0L+td3N4VdPDl7XoEnnDkUMlEUCzm7cRrw+Nyv0SF+rhDfN
 6mTXDRnQwADPlUMxC5Y/KsI7ZA2M+mc13fFVt9YNA2wbjY3D5Pw=
 =QtOe
 -----END PGP SIGNATURE-----

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>
This commit is contained in:
Ingo Molnar 2018-03-07 09:18:32 +01:00
commit 629ae2ee73
11 changed files with 61 additions and 15 deletions

View File

@ -213,6 +213,7 @@
#define X86_FEATURE_SEV ( 7*32+20) /* AMD Secure Encrypted Virtualization */
#define X86_FEATURE_USE_IBPB ( 7*32+21) /* "" Indirect Branch Prediction Barrier enabled */
#define X86_FEATURE_USE_IBRS_FW ( 7*32+22) /* "" Use IBRS during runtime firmware calls */
/* Virtualization flags: Linux defined, word 8 */
#define X86_FEATURE_TPR_SHADOW ( 8*32+ 0) /* Intel TPR Shadow */

View File

@ -761,6 +761,7 @@ struct kvm_ppc_resize_hpt {
#define KVM_TRACE_PAUSE __KVM_DEPRECATED_MAIN_0x07
#define KVM_TRACE_DISABLE __KVM_DEPRECATED_MAIN_0x08
#define KVM_GET_EMULATED_CPUID _IOWR(KVMIO, 0x09, struct kvm_cpuid2)
#define KVM_GET_MSR_FEATURE_INDEX_LIST _IOWR(KVMIO, 0x0a, struct kvm_msr_list)
/*
* Extension capability list.
@ -934,6 +935,7 @@ struct kvm_ppc_resize_hpt {
#define KVM_CAP_S390_AIS_MIGRATION 150
#define KVM_CAP_PPC_GET_CPU_CHAR 151
#define KVM_CAP_S390_BPB 152
#define KVM_CAP_GET_MSR_FEATURES 153
#ifdef KVM_CAP_IRQ_ROUTING

View File

@ -8,7 +8,7 @@ perf-kallsyms - Searches running kernel for symbols
SYNOPSIS
--------
[verse]
'perf kallsyms <options> symbol_name[,symbol_name...]'
'perf kallsyms' [<options>] symbol_name[,symbol_name...]
DESCRIPTION
-----------

View File

@ -881,6 +881,15 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
}
}
/*
* If we have just single event and are sending data
* through pipe, we need to force the ids allocation,
* because we synthesize event name through the pipe
* and need the id for that.
*/
if (data->is_pipe && rec->evlist->nr_entries == 1)
rec->opts.sample_id = true;
if (record__open(rec) != 0) {
err = -1;
goto out_child;

View File

@ -917,7 +917,7 @@ static void print_metric_csv(void *ctx,
char buf[64], *vals, *ends;
if (unit == NULL || fmt == NULL) {
fprintf(out, "%s%s%s%s", csv_sep, csv_sep, csv_sep, csv_sep);
fprintf(out, "%s%s", csv_sep, csv_sep);
return;
}
snprintf(buf, sizeof(buf), fmt, val);

View File

@ -991,7 +991,7 @@ static int perf_top_overwrite_fallback(struct perf_top *top,
evlist__for_each_entry(evlist, counter)
counter->attr.write_backward = false;
opts->overwrite = false;
ui__warning("fall back to non-overwrite mode\n");
pr_debug2("fall back to non-overwrite mode\n");
return 1;
}

View File

@ -61,6 +61,7 @@ struct record_opts {
bool tail_synthesize;
bool overwrite;
bool ignore_missing_thread;
bool sample_id;
unsigned int freq;
unsigned int mmap_pages;
unsigned int auxtrace_mmap_pages;

View File

@ -327,7 +327,32 @@ static void annotate_browser__draw_current_jump(struct ui_browser *browser)
if (!disasm_line__is_valid_jump(cursor, sym))
return;
/*
* This first was seen with a gcc function, _cpp_lex_token, that
* has the usual jumps:
*
* 1159e6c: jne 115aa32 <_cpp_lex_token@@Base+0xf92>
*
* I.e. jumps to a label inside that function (_cpp_lex_token), and
* those works, but also this kind:
*
* 1159e8b: jne c469be <cpp_named_operator2name@@Base+0xa72>
*
* I.e. jumps to another function, outside _cpp_lex_token, which
* are not being correctly handled generating as a side effect references
* to ab->offset[] entries that are set to NULL, so to make this code
* more robust, check that here.
*
* A proper fix for will be put in place, looking at the function
* name right after the '<' token and probably treating this like a
* 'call' instruction.
*/
target = ab->offsets[cursor->ops.target.offset];
if (target == NULL) {
ui_helpline__printf("WARN: jump target inconsistency, press 'o', ab->offsets[%#x] = NULL\n",
cursor->ops.target.offset);
return;
}
bcursor = browser_line(&cursor->al);
btarget = browser_line(target);

View File

@ -60,6 +60,12 @@
#include "sane_ctype.h"
#include "symbol/kallsyms.h"
static bool auxtrace__dont_decode(struct perf_session *session)
{
return !session->itrace_synth_opts ||
session->itrace_synth_opts->dont_decode;
}
int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
struct auxtrace_mmap_params *mp,
void *userpg, int fd)
@ -762,6 +768,9 @@ int auxtrace_queues__process_index(struct auxtrace_queues *queues,
size_t i;
int err;
if (auxtrace__dont_decode(session))
return 0;
list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) {
for (i = 0; i < auxtrace_index->nr; i++) {
ent = &auxtrace_index->entries[i];
@ -892,12 +901,6 @@ out_free:
return err;
}
static bool auxtrace__dont_decode(struct perf_session *session)
{
return !session->itrace_synth_opts ||
session->itrace_synth_opts->dont_decode;
}
int perf_event__process_auxtrace_info(struct perf_tool *tool __maybe_unused,
union perf_event *event,
struct perf_session *session)

View File

@ -137,6 +137,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts,
struct perf_evsel *evsel;
bool use_sample_identifier = false;
bool use_comm_exec;
bool sample_id = opts->sample_id;
/*
* Set the evsel leader links before we configure attributes,
@ -163,8 +164,7 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts,
* match the id.
*/
use_sample_identifier = perf_can_sample_identifier();
evlist__for_each_entry(evlist, evsel)
perf_evsel__set_sample_id(evsel, use_sample_identifier);
sample_id = true;
} else if (evlist->nr_entries > 1) {
struct perf_evsel *first = perf_evlist__first(evlist);
@ -174,6 +174,10 @@ void perf_evlist__config(struct perf_evlist *evlist, struct record_opts *opts,
use_sample_identifier = perf_can_sample_identifier();
break;
}
sample_id = true;
}
if (sample_id) {
evlist__for_each_entry(evlist, evsel)
perf_evsel__set_sample_id(evsel, use_sample_identifier);
}

View File

@ -12,7 +12,7 @@
* States and transits:
*
*
* OFF--(on)--> READY --(hit)--> HIT
* OFF--> ON --> READY --(hit)--> HIT
* ^ |
* | (ready)
* | |
@ -27,8 +27,9 @@ struct trigger {
volatile enum {
TRIGGER_ERROR = -2,
TRIGGER_OFF = -1,
TRIGGER_READY = 0,
TRIGGER_HIT = 1,
TRIGGER_ON = 0,
TRIGGER_READY = 1,
TRIGGER_HIT = 2,
} state;
const char *name;
};
@ -50,7 +51,7 @@ static inline bool trigger_is_error(struct trigger *t)
static inline void trigger_on(struct trigger *t)
{
TRIGGER_WARN_ONCE(t, TRIGGER_OFF);
t->state = TRIGGER_READY;
t->state = TRIGGER_ON;
}
static inline void trigger_ready(struct trigger *t)