Merge remote-tracking branch 'tip/perf/urgent' into perf/core
Merge reason: We are going to queue up a dependent patch:
"perf tools: Move parse event automated tests to separated object"
That depends on:
commit e7c72d8
perf tools: Add 'G' and 'H' modifiers to event parsing
Conflicts:
tools/perf/builtin-stat.c
Conflicted with the recent 'perf_target' patches when checking the
result of perf_evsel open routines to see if a retry is needed to cope
with older kernels where the exclude guest/host perf_event_attr bits
were not used.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -201,8 +201,8 @@ endif
|
||||
|
||||
export PERL_PATH
|
||||
|
||||
FLEX = $(CROSS_COMPILE)flex
|
||||
BISON= $(CROSS_COMPILE)bison
|
||||
FLEX = flex
|
||||
BISON= bison
|
||||
|
||||
$(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
|
||||
@@ -737,10 +737,10 @@ $(OUTPUT)perf.o perf.spec \
|
||||
# over the general rule for .o
|
||||
|
||||
$(OUTPUT)util/%-flex.o: $(OUTPUT)util/%-flex.c $(OUTPUT)PERF-CFLAGS
|
||||
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Iutil/ -Wno-redundant-decls -Wno-switch-default -Wno-unused-function $<
|
||||
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Iutil/ -w $<
|
||||
|
||||
$(OUTPUT)util/%-bison.o: $(OUTPUT)util/%-bison.c $(OUTPUT)PERF-CFLAGS
|
||||
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0 -Iutil/ -Wno-redundant-decls -Wno-switch-default -Wno-unused-function $<
|
||||
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0 -Iutil/ -w $<
|
||||
|
||||
$(OUTPUT)%.o: %.c $(OUTPUT)PERF-CFLAGS
|
||||
$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
|
||||
|
||||
@@ -377,16 +377,23 @@ static int __cmd_report(struct perf_report *rep)
|
||||
(kernel_map->dso->hit &&
|
||||
(kernel_kmap->ref_reloc_sym == NULL ||
|
||||
kernel_kmap->ref_reloc_sym->addr == 0))) {
|
||||
const struct dso *kdso = kernel_map->dso;
|
||||
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;
|
||||
if (!RB_EMPTY_ROOT(&kdso->symbols[MAP__FUNCTION])) {
|
||||
desc = "If some relocation was applied (e.g. "
|
||||
"kexec) symbols may be misresolved.";
|
||||
}
|
||||
}
|
||||
|
||||
ui__warning(
|
||||
"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"
|
||||
"Samples in kernel modules can't be resolved as well.\n\n",
|
||||
RB_EMPTY_ROOT(&kdso->symbols[MAP__FUNCTION]) ?
|
||||
"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.");
|
||||
desc);
|
||||
}
|
||||
|
||||
if (dump_trace) {
|
||||
|
||||
@@ -282,6 +282,8 @@ static int create_perf_stat_counter(struct perf_evsel *evsel,
|
||||
{
|
||||
struct perf_event_attr *attr = &evsel->attr;
|
||||
struct xyarray *group_fd = NULL;
|
||||
bool exclude_guest_missing = false;
|
||||
int ret;
|
||||
|
||||
if (group && evsel != first)
|
||||
group_fd = first->fd;
|
||||
@@ -292,16 +294,39 @@ static int create_perf_stat_counter(struct perf_evsel *evsel,
|
||||
|
||||
attr->inherit = !no_inherit;
|
||||
|
||||
if (perf_target__has_cpu(&target))
|
||||
return perf_evsel__open_per_cpu(evsel, evsel_list->cpus,
|
||||
group, group_fd);
|
||||
retry:
|
||||
if (exclude_guest_missing)
|
||||
evsel->attr.exclude_guest = evsel->attr.exclude_host = 0;
|
||||
|
||||
if (perf_target__has_cpu(&target)) {
|
||||
ret = perf_evsel__open_per_cpu(evsel, evsel_list->cpus,
|
||||
group, group_fd);
|
||||
if (ret)
|
||||
goto check_ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!perf_target__has_task(&target) && (!group || evsel == first)) {
|
||||
attr->disabled = 1;
|
||||
attr->enable_on_exec = 1;
|
||||
}
|
||||
|
||||
return perf_evsel__open_per_thread(evsel, evsel_list->threads,
|
||||
group, group_fd);
|
||||
ret = perf_evsel__open_per_thread(evsel, evsel_list->threads,
|
||||
group, group_fd);
|
||||
if (!ret)
|
||||
return 0;
|
||||
/* fall through */
|
||||
check_ret:
|
||||
if (ret && errno == EINVAL) {
|
||||
if (!exclude_guest_missing &&
|
||||
(evsel->attr.exclude_guest || evsel->attr.exclude_host)) {
|
||||
pr_debug("Old kernel, cannot exclude "
|
||||
"guest or host samples.\n");
|
||||
exclude_guest_missing = true;
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -851,6 +851,28 @@ static int test__checkevent_symbolic_name_modifier(struct perf_evlist *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)
|
||||
{
|
||||
struct perf_evsel *evsel = list_entry(evlist->entries.next,
|
||||
@@ -1091,6 +1113,14 @@ static struct test__event_st {
|
||||
.name = "r1,syscalls:sys_enter_open:k,1:1:hp",
|
||||
.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))
|
||||
|
||||
@@ -291,7 +291,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,
|
||||
if (mkdir_p(filename, 0755))
|
||||
goto out_free;
|
||||
|
||||
snprintf(filename + len, sizeof(filename) - len, "/%s", sbuild_id);
|
||||
snprintf(filename + len, size - len, "/%s", sbuild_id);
|
||||
|
||||
if (access(filename, F_OK)) {
|
||||
if (is_kallsyms) {
|
||||
|
||||
@@ -54,7 +54,7 @@ num_dec [0-9]+
|
||||
num_hex 0x[a-fA-F0-9]+
|
||||
num_raw_hex [a-fA-F0-9]+
|
||||
name [a-zA-Z_*?][a-zA-Z0-9_*?]*
|
||||
modifier_event [ukhp]{1,5}
|
||||
modifier_event [ukhpGH]{1,8}
|
||||
modifier_bp [rwx]
|
||||
|
||||
%%
|
||||
|
||||
@@ -977,8 +977,9 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
|
||||
* 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).
|
||||
*/
|
||||
static int dso__synthesize_plt_symbols(struct dso *dso, struct map *map,
|
||||
symbol_filter_t filter)
|
||||
static int
|
||||
dso__synthesize_plt_symbols(struct dso *dso, char *name, struct map *map,
|
||||
symbol_filter_t filter)
|
||||
{
|
||||
uint32_t nr_rel_entries, idx;
|
||||
GElf_Sym sym;
|
||||
@@ -993,10 +994,7 @@ static int dso__synthesize_plt_symbols(struct dso *dso, struct map *map,
|
||||
char sympltname[1024];
|
||||
Elf *elf;
|
||||
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);
|
||||
if (fd < 0)
|
||||
goto out;
|
||||
@@ -1703,8 +1701,9 @@ restart:
|
||||
continue;
|
||||
|
||||
if (ret > 0) {
|
||||
int nr_plt = dso__synthesize_plt_symbols(dso, map,
|
||||
filter);
|
||||
int nr_plt;
|
||||
|
||||
nr_plt = dso__synthesize_plt_symbols(dso, name, map, filter);
|
||||
if (nr_plt > 0)
|
||||
ret += nr_plt;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user