Commit 06fc5d3d authored by Linus Torvalds's avatar Linus Torvalds

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)
parents f6072452 724b6daa
...@@ -3183,7 +3183,7 @@ static void perf_event_for_each(struct perf_event *event, ...@@ -3183,7 +3183,7 @@ static void perf_event_for_each(struct perf_event *event,
perf_event_for_each_child(event, func); perf_event_for_each_child(event, func);
func(event); func(event);
list_for_each_entry(sibling, &event->sibling_list, group_entry) list_for_each_entry(sibling, &event->sibling_list, group_entry)
perf_event_for_each_child(event, func); perf_event_for_each_child(sibling, func);
mutex_unlock(&ctx->mutex); mutex_unlock(&ctx->mutex);
} }
......
...@@ -4629,7 +4629,8 @@ static ssize_t ...@@ -4629,7 +4629,8 @@ static ssize_t
rb_simple_read(struct file *filp, char __user *ubuf, rb_simple_read(struct file *filp, char __user *ubuf,
size_t cnt, loff_t *ppos) size_t cnt, loff_t *ppos)
{ {
struct ring_buffer *buffer = filp->private_data; struct trace_array *tr = filp->private_data;
struct ring_buffer *buffer = tr->buffer;
char buf[64]; char buf[64];
int r; int r;
...@@ -4647,7 +4648,8 @@ static ssize_t ...@@ -4647,7 +4648,8 @@ static ssize_t
rb_simple_write(struct file *filp, const char __user *ubuf, rb_simple_write(struct file *filp, const char __user *ubuf,
size_t cnt, loff_t *ppos) size_t cnt, loff_t *ppos)
{ {
struct ring_buffer *buffer = filp->private_data; struct trace_array *tr = filp->private_data;
struct ring_buffer *buffer = tr->buffer;
unsigned long val; unsigned long val;
int ret; int ret;
...@@ -4734,7 +4736,7 @@ static __init int tracer_init_debugfs(void) ...@@ -4734,7 +4736,7 @@ static __init int tracer_init_debugfs(void)
&trace_clock_fops); &trace_clock_fops);
trace_create_file("tracing_on", 0644, d_tracer, trace_create_file("tracing_on", 0644, d_tracer,
global_trace.buffer, &rb_simple_fops); &global_trace, &rb_simple_fops);
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
trace_create_file("dyn_ftrace_total_info", 0444, d_tracer, trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
......
...@@ -836,11 +836,11 @@ extern const char *__stop___trace_bprintk_fmt[]; ...@@ -836,11 +836,11 @@ extern const char *__stop___trace_bprintk_fmt[];
filter) filter)
#include "trace_entries.h" #include "trace_entries.h"
#ifdef CONFIG_FUNCTION_TRACER #if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_FUNCTION_TRACER)
int perf_ftrace_event_register(struct ftrace_event_call *call, int perf_ftrace_event_register(struct ftrace_event_call *call,
enum trace_reg type, void *data); enum trace_reg type, void *data);
#else #else
#define perf_ftrace_event_register NULL #define perf_ftrace_event_register NULL
#endif /* CONFIG_FUNCTION_TRACER */ #endif
#endif /* _LINUX_KERNEL_TRACE_H */ #endif /* _LINUX_KERNEL_TRACE_H */
...@@ -652,6 +652,8 @@ int trace_print_lat_context(struct trace_iterator *iter) ...@@ -652,6 +652,8 @@ int trace_print_lat_context(struct trace_iterator *iter)
{ {
u64 next_ts; u64 next_ts;
int ret; int ret;
/* trace_find_next_entry will reset ent_size */
int ent_size = iter->ent_size;
struct trace_seq *s = &iter->seq; struct trace_seq *s = &iter->seq;
struct trace_entry *entry = iter->ent, struct trace_entry *entry = iter->ent,
*next_entry = trace_find_next_entry(iter, NULL, *next_entry = trace_find_next_entry(iter, NULL,
...@@ -660,6 +662,9 @@ int trace_print_lat_context(struct trace_iterator *iter) ...@@ -660,6 +662,9 @@ int trace_print_lat_context(struct trace_iterator *iter)
unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start); unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start);
unsigned long rel_usecs; unsigned long rel_usecs;
/* Restore the original ent_size */
iter->ent_size = ent_size;
if (!next_entry) if (!next_entry)
next_ts = iter->ts; next_ts = iter->ts;
rel_usecs = ns2usecs(next_ts - iter->ts); rel_usecs = ns2usecs(next_ts - iter->ts);
......
...@@ -234,8 +234,8 @@ endif ...@@ -234,8 +234,8 @@ endif
export PERL_PATH export PERL_PATH
FLEX = $(CROSS_COMPILE)flex FLEX = flex
BISON= $(CROSS_COMPILE)bison BISON= bison
$(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-flex.c: util/parse-events.l
$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c $(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c
......
...@@ -374,16 +374,23 @@ static int __cmd_report(struct perf_report *rep) ...@@ -374,16 +374,23 @@ static int __cmd_report(struct perf_report *rep)
(kernel_map->dso->hit && (kernel_map->dso->hit &&
(kernel_kmap->ref_reloc_sym == NULL || (kernel_kmap->ref_reloc_sym == NULL ||
kernel_kmap->ref_reloc_sym->addr == 0))) { kernel_kmap->ref_reloc_sym->addr == 0))) {
const char *desc =
"As no suitable kallsyms nor vmlinux was found, kernel samples\n"
"can't be resolved.";
if (kernel_map) {
const struct dso *kdso = kernel_map->dso; const struct dso *kdso = kernel_map->dso;
if (!RB_EMPTY_ROOT(&kdso->symbols[MAP__FUNCTION])) {
desc = "If some relocation was applied (e.g. "
"kexec) symbols may be misresolved.";
}
}
ui__warning( ui__warning(
"Kernel address maps (/proc/{kallsyms,modules}) were restricted.\n\n" "Kernel address maps (/proc/{kallsyms,modules}) were restricted.\n\n"
"Check /proc/sys/kernel/kptr_restrict before running 'perf record'.\n\n%s\n\n" "Check /proc/sys/kernel/kptr_restrict before running 'perf record'.\n\n%s\n\n"
"Samples in kernel modules can't be resolved as well.\n\n", "Samples in kernel modules can't be resolved as well.\n\n",
RB_EMPTY_ROOT(&kdso->symbols[MAP__FUNCTION]) ? desc);
"As no suitable kallsyms nor vmlinux was found, kernel samples\n"
"can't be resolved." :
"If some relocation was applied (e.g. kexec) symbols may be misresolved.");
} }
if (dump_trace) { if (dump_trace) {
......
...@@ -851,6 +851,28 @@ static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist) ...@@ -851,6 +851,28 @@ static int test__checkevent_symbolic_name_modifier(struct perf_evlist *evlist)
return test__checkevent_symbolic_name(evlist); return test__checkevent_symbolic_name(evlist);
} }
static int test__checkevent_exclude_host_modifier(struct perf_evlist *evlist)
{
struct perf_evsel *evsel = list_entry(evlist->entries.next,
struct perf_evsel, node);
TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
return test__checkevent_symbolic_name(evlist);
}
static int test__checkevent_exclude_guest_modifier(struct perf_evlist *evlist)
{
struct perf_evsel *evsel = list_entry(evlist->entries.next,
struct perf_evsel, node);
TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);
TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
return test__checkevent_symbolic_name(evlist);
}
static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist) static int test__checkevent_symbolic_alias_modifier(struct perf_evlist *evlist)
{ {
struct perf_evsel *evsel = list_entry(evlist->entries.next, struct perf_evsel *evsel = list_entry(evlist->entries.next,
...@@ -1091,6 +1113,14 @@ static struct test__event_st { ...@@ -1091,6 +1113,14 @@ static struct test__event_st {
.name = "r1,syscalls:sys_enter_open:k,1:1:hp", .name = "r1,syscalls:sys_enter_open:k,1:1:hp",
.check = test__checkevent_list, .check = test__checkevent_list,
}, },
{
.name = "instructions:G",
.check = test__checkevent_exclude_host_modifier,
},
{
.name = "instructions:H",
.check = test__checkevent_exclude_guest_modifier,
},
}; };
#define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st)) #define TEST__EVENTS_CNT (sizeof(test__events) / sizeof(struct test__event_st))
......
...@@ -54,7 +54,7 @@ num_dec [0-9]+ ...@@ -54,7 +54,7 @@ num_dec [0-9]+
num_hex 0x[a-fA-F0-9]+ num_hex 0x[a-fA-F0-9]+
num_raw_hex [a-fA-F0-9]+ num_raw_hex [a-fA-F0-9]+
name [a-zA-Z_*?][a-zA-Z0-9_*?]* name [a-zA-Z_*?][a-zA-Z0-9_*?]*
modifier_event [ukhp]{1,5} modifier_event [ukhpGH]{1,8}
modifier_bp [rwx] modifier_bp [rwx]
%% %%
......
...@@ -977,7 +977,8 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, ...@@ -977,7 +977,8 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
* And always look at the original dso, not at debuginfo packages, that * And always look at the original dso, not at debuginfo packages, that
* have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS). * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
*/ */
static int dso__synthesize_plt_symbols(struct dso *dso, struct map *map, static int
dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map,
symbol_filter_t filter) symbol_filter_t filter)
{ {
uint32_t nr_rel_entries, idx; uint32_t nr_rel_entries, idx;
...@@ -993,10 +994,7 @@ static int dso__synthesize_plt_symbols(struct dso *dso, struct map *map, ...@@ -993,10 +994,7 @@ static int dso__synthesize_plt_symbols(struct dso *dso, struct map *map,
char sympltname[1024]; char sympltname[1024];
Elf *elf; Elf *elf;
int nr = 0, symidx, fd, err = 0; int nr = 0, symidx, fd, err = 0;
char name[PATH_MAX];
snprintf(name, sizeof(name), "%s%s",
symbol_conf.symfs, dso->long_name);
fd = open(name, O_RDONLY); fd = open(name, O_RDONLY);
if (fd < 0) if (fd < 0)
goto out; goto out;
...@@ -1703,8 +1701,9 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter) ...@@ -1703,8 +1701,9 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
continue; continue;
if (ret > 0) { if (ret > 0) {
int nr_plt = dso__synthesize_plt_symbols(dso, map, int nr_plt;
filter);
nr_plt = dso__synthesize_plt_symbols(dso, name, map, filter);
if (nr_plt > 0) if (nr_plt > 0)
ret += nr_plt; ret += nr_plt;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment