mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
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:
commit
629ae2ee73
@ -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 */
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
-----------
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user