perf/urgent fixes:
perf probe: Masami Hiramatsu: - Fix deletion of multiple probe events. - Fix userspace libraries handling by not depending on dwfl_module_addrsym(). Event parsing: Ian Rogers: - Fix reading of invalid memory in event parsing. python binding: Ilie Halip: - Fix clang detection when using CC=clang-version. build: Masami Hiramatsu: - Fix O= use with relative paths. Android: Dominik b. Czarnota: - Fix off by one in strncpy() size argument when handling Android libraries. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCXmZSRAAKCRCyPKLppCJ+ JwRrAQCrtJnNothjpZuzQTAouu4vA5BRoUOQvrvN1CSK+baaMwEAonaSfWGgYDDp W9Vt51C9iNFY/Oz3vI11s/gefyyrAw4= =bi0c -----END PGP SIGNATURE----- Merge tag 'perf-urgent-for-mingo-5.6-20200309' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent Pull perf/urgent fixes from Arnaldo Carvalho de Melo: perf probe: Masami Hiramatsu: - Fix deletion of multiple probe events. - Fix userspace libraries handling by not depending on dwfl_module_addrsym(). Event parsing: Ian Rogers: - Fix reading of invalid memory in event parsing. python binding: Ilie Halip: - Fix clang detection when using CC=clang-version. build: Masami Hiramatsu: - Fix O= use with relative paths. Android: Dominik b. Czarnota: - Fix off by one in strncpy() size argument when handling Android libraries. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
db5d85ce82
@ -35,7 +35,7 @@ endif
|
|||||||
# Only pass canonical directory names as the output directory:
|
# Only pass canonical directory names as the output directory:
|
||||||
#
|
#
|
||||||
ifneq ($(O),)
|
ifneq ($(O),)
|
||||||
FULL_O := $(shell readlink -f $(O) || echo $(O))
|
FULL_O := $(shell cd $(PWD); readlink -f $(O) || echo $(O))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -89,7 +89,7 @@ static inline bool replace_android_lib(const char *filename, char *newfilename)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strncmp(filename, "/system/lib/", 11)) {
|
if (!strncmp(filename, "/system/lib/", 12)) {
|
||||||
char *ndk, *app;
|
char *ndk, *app;
|
||||||
const char *arch;
|
const char *arch;
|
||||||
size_t ndk_length;
|
size_t ndk_length;
|
||||||
|
@ -1213,7 +1213,7 @@ static int config_attr(struct perf_event_attr *attr,
|
|||||||
static int get_config_terms(struct list_head *head_config,
|
static int get_config_terms(struct list_head *head_config,
|
||||||
struct list_head *head_terms __maybe_unused)
|
struct list_head *head_terms __maybe_unused)
|
||||||
{
|
{
|
||||||
#define ADD_CONFIG_TERM(__type) \
|
#define ADD_CONFIG_TERM(__type, __weak) \
|
||||||
struct perf_evsel_config_term *__t; \
|
struct perf_evsel_config_term *__t; \
|
||||||
\
|
\
|
||||||
__t = zalloc(sizeof(*__t)); \
|
__t = zalloc(sizeof(*__t)); \
|
||||||
@ -1222,18 +1222,18 @@ static int get_config_terms(struct list_head *head_config,
|
|||||||
\
|
\
|
||||||
INIT_LIST_HEAD(&__t->list); \
|
INIT_LIST_HEAD(&__t->list); \
|
||||||
__t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \
|
__t->type = PERF_EVSEL__CONFIG_TERM_ ## __type; \
|
||||||
__t->weak = term->weak; \
|
__t->weak = __weak; \
|
||||||
list_add_tail(&__t->list, head_terms)
|
list_add_tail(&__t->list, head_terms)
|
||||||
|
|
||||||
#define ADD_CONFIG_TERM_VAL(__type, __name, __val) \
|
#define ADD_CONFIG_TERM_VAL(__type, __name, __val, __weak) \
|
||||||
do { \
|
do { \
|
||||||
ADD_CONFIG_TERM(__type); \
|
ADD_CONFIG_TERM(__type, __weak); \
|
||||||
__t->val.__name = __val; \
|
__t->val.__name = __val; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define ADD_CONFIG_TERM_STR(__type, __val) \
|
#define ADD_CONFIG_TERM_STR(__type, __val, __weak) \
|
||||||
do { \
|
do { \
|
||||||
ADD_CONFIG_TERM(__type); \
|
ADD_CONFIG_TERM(__type, __weak); \
|
||||||
__t->val.str = strdup(__val); \
|
__t->val.str = strdup(__val); \
|
||||||
if (!__t->val.str) { \
|
if (!__t->val.str) { \
|
||||||
zfree(&__t); \
|
zfree(&__t); \
|
||||||
@ -1247,62 +1247,62 @@ do { \
|
|||||||
list_for_each_entry(term, head_config, list) {
|
list_for_each_entry(term, head_config, list) {
|
||||||
switch (term->type_term) {
|
switch (term->type_term) {
|
||||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
|
case PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD:
|
||||||
ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num);
|
ADD_CONFIG_TERM_VAL(PERIOD, period, term->val.num, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
|
case PARSE_EVENTS__TERM_TYPE_SAMPLE_FREQ:
|
||||||
ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num);
|
ADD_CONFIG_TERM_VAL(FREQ, freq, term->val.num, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_TIME:
|
case PARSE_EVENTS__TERM_TYPE_TIME:
|
||||||
ADD_CONFIG_TERM_VAL(TIME, time, term->val.num);
|
ADD_CONFIG_TERM_VAL(TIME, time, term->val.num, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
|
case PARSE_EVENTS__TERM_TYPE_CALLGRAPH:
|
||||||
ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str);
|
ADD_CONFIG_TERM_STR(CALLGRAPH, term->val.str, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
|
case PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE:
|
||||||
ADD_CONFIG_TERM_STR(BRANCH, term->val.str);
|
ADD_CONFIG_TERM_STR(BRANCH, term->val.str, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
|
case PARSE_EVENTS__TERM_TYPE_STACKSIZE:
|
||||||
ADD_CONFIG_TERM_VAL(STACK_USER, stack_user,
|
ADD_CONFIG_TERM_VAL(STACK_USER, stack_user,
|
||||||
term->val.num);
|
term->val.num, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_INHERIT:
|
case PARSE_EVENTS__TERM_TYPE_INHERIT:
|
||||||
ADD_CONFIG_TERM_VAL(INHERIT, inherit,
|
ADD_CONFIG_TERM_VAL(INHERIT, inherit,
|
||||||
term->val.num ? 1 : 0);
|
term->val.num ? 1 : 0, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
|
case PARSE_EVENTS__TERM_TYPE_NOINHERIT:
|
||||||
ADD_CONFIG_TERM_VAL(INHERIT, inherit,
|
ADD_CONFIG_TERM_VAL(INHERIT, inherit,
|
||||||
term->val.num ? 0 : 1);
|
term->val.num ? 0 : 1, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
|
case PARSE_EVENTS__TERM_TYPE_MAX_STACK:
|
||||||
ADD_CONFIG_TERM_VAL(MAX_STACK, max_stack,
|
ADD_CONFIG_TERM_VAL(MAX_STACK, max_stack,
|
||||||
term->val.num);
|
term->val.num, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
|
case PARSE_EVENTS__TERM_TYPE_MAX_EVENTS:
|
||||||
ADD_CONFIG_TERM_VAL(MAX_EVENTS, max_events,
|
ADD_CONFIG_TERM_VAL(MAX_EVENTS, max_events,
|
||||||
term->val.num);
|
term->val.num, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
|
case PARSE_EVENTS__TERM_TYPE_OVERWRITE:
|
||||||
ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
|
ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
|
||||||
term->val.num ? 1 : 0);
|
term->val.num ? 1 : 0, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
|
case PARSE_EVENTS__TERM_TYPE_NOOVERWRITE:
|
||||||
ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
|
ADD_CONFIG_TERM_VAL(OVERWRITE, overwrite,
|
||||||
term->val.num ? 0 : 1);
|
term->val.num ? 0 : 1, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
|
case PARSE_EVENTS__TERM_TYPE_DRV_CFG:
|
||||||
ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str);
|
ADD_CONFIG_TERM_STR(DRV_CFG, term->val.str, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_PERCORE:
|
case PARSE_EVENTS__TERM_TYPE_PERCORE:
|
||||||
ADD_CONFIG_TERM_VAL(PERCORE, percore,
|
ADD_CONFIG_TERM_VAL(PERCORE, percore,
|
||||||
term->val.num ? true : false);
|
term->val.num ? true : false, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
|
case PARSE_EVENTS__TERM_TYPE_AUX_OUTPUT:
|
||||||
ADD_CONFIG_TERM_VAL(AUX_OUTPUT, aux_output,
|
ADD_CONFIG_TERM_VAL(AUX_OUTPUT, aux_output,
|
||||||
term->val.num ? 1 : 0);
|
term->val.num ? 1 : 0, term->weak);
|
||||||
break;
|
break;
|
||||||
case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
|
case PARSE_EVENTS__TERM_TYPE_AUX_SAMPLE_SIZE:
|
||||||
ADD_CONFIG_TERM_VAL(AUX_SAMPLE_SIZE, aux_sample_size,
|
ADD_CONFIG_TERM_VAL(AUX_SAMPLE_SIZE, aux_sample_size,
|
||||||
term->val.num);
|
term->val.num, term->weak);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -1339,7 +1339,7 @@ static int get_config_chgs(struct perf_pmu *pmu, struct list_head *head_config,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bits)
|
if (bits)
|
||||||
ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits);
|
ADD_CONFIG_TERM_VAL(CFG_CHG, cfg_chg, bits, false);
|
||||||
|
|
||||||
#undef ADD_CONFIG_TERM
|
#undef ADD_CONFIG_TERM
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -206,6 +206,9 @@ static struct strlist *__probe_file__get_namelist(int fd, bool include_group)
|
|||||||
} else
|
} else
|
||||||
ret = strlist__add(sl, tev.event);
|
ret = strlist__add(sl, tev.event);
|
||||||
clear_probe_trace_event(&tev);
|
clear_probe_trace_event(&tev);
|
||||||
|
/* Skip if there is same name multi-probe event in the list */
|
||||||
|
if (ret == -EEXIST)
|
||||||
|
ret = 0;
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -637,14 +637,19 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, Dwfl_Module *mod,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to get actual symbol name from symtab */
|
if (dwarf_entrypc(sp_die, &eaddr) == 0) {
|
||||||
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
|
/* If the DIE has entrypc, use it. */
|
||||||
|
symbol = dwarf_diename(sp_die);
|
||||||
|
} else {
|
||||||
|
/* Try to get actual symbol name and address from symtab */
|
||||||
|
symbol = dwfl_module_addrsym(mod, paddr, &sym, NULL);
|
||||||
|
eaddr = sym.st_value;
|
||||||
|
}
|
||||||
if (!symbol) {
|
if (!symbol) {
|
||||||
pr_warning("Failed to find symbol at 0x%lx\n",
|
pr_warning("Failed to find symbol at 0x%lx\n",
|
||||||
(unsigned long)paddr);
|
(unsigned long)paddr);
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
eaddr = sym.st_value;
|
|
||||||
|
|
||||||
tp->offset = (unsigned long)(paddr - eaddr);
|
tp->offset = (unsigned long)(paddr - eaddr);
|
||||||
tp->address = (unsigned long)paddr;
|
tp->address = (unsigned long)paddr;
|
||||||
|
@ -2,11 +2,13 @@ from os import getenv
|
|||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
from re import sub
|
from re import sub
|
||||||
|
|
||||||
def clang_has_option(option):
|
|
||||||
return [o for o in Popen(['clang', option], stderr=PIPE).stderr.readlines() if b"unknown argument" in o] == [ ]
|
|
||||||
|
|
||||||
cc = getenv("CC")
|
cc = getenv("CC")
|
||||||
if cc == "clang":
|
cc_is_clang = b"clang version" in Popen([cc, "-v"], stderr=PIPE).stderr.readline()
|
||||||
|
|
||||||
|
def clang_has_option(option):
|
||||||
|
return [o for o in Popen([cc, option], stderr=PIPE).stderr.readlines() if b"unknown argument" in o] == [ ]
|
||||||
|
|
||||||
|
if cc_is_clang:
|
||||||
from distutils.sysconfig import get_config_vars
|
from distutils.sysconfig import get_config_vars
|
||||||
vars = get_config_vars()
|
vars = get_config_vars()
|
||||||
for var in ('CFLAGS', 'OPT'):
|
for var in ('CFLAGS', 'OPT'):
|
||||||
@ -40,7 +42,7 @@ class install_lib(_install_lib):
|
|||||||
cflags = getenv('CFLAGS', '').split()
|
cflags = getenv('CFLAGS', '').split()
|
||||||
# switch off several checks (need to be at the end of cflags list)
|
# switch off several checks (need to be at the end of cflags list)
|
||||||
cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ]
|
cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ]
|
||||||
if cc != "clang":
|
if not cc_is_clang:
|
||||||
cflags += ['-Wno-cast-function-type' ]
|
cflags += ['-Wno-cast-function-type' ]
|
||||||
|
|
||||||
src_perf = getenv('srctree') + '/tools/perf'
|
src_perf = getenv('srctree') + '/tools/perf'
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
ifneq ($(O),)
|
ifneq ($(O),)
|
||||||
ifeq ($(origin O), command line)
|
ifeq ($(origin O), command line)
|
||||||
dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),)
|
dummy := $(if $(shell cd $(PWD); test -d $(O) || echo $(O)),$(error O=$(O) does not exist),)
|
||||||
ABSOLUTE_O := $(shell cd $(O) ; pwd)
|
ABSOLUTE_O := $(shell cd $(PWD); cd $(O) ; pwd)
|
||||||
OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/)
|
OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/)
|
||||||
COMMAND_O := O=$(ABSOLUTE_O)
|
COMMAND_O := O=$(ABSOLUTE_O)
|
||||||
ifeq ($(objtree),)
|
ifeq ($(objtree),)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user