Commit 76ccd234 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 tooling fixes from Ingo Molnar:
 "A handful of tooling fixes all across the map, no kernel changes"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  tools headers uapi: Update linux/in.h copy
  perf probe: Do not depend on dwfl_module_addrsym()
  perf probe: Fix to delete multiple probe event
  perf parse-events: Fix reading of invalid memory in event parsing
  perf python: Fix clang detection when using CC=clang-version
  perf map: Fix off by one in strncpy() size argument
  tools: Let O= makes handle a relative path with -C option
parents 3f3ee43a 564200ed
...@@ -74,6 +74,8 @@ enum { ...@@ -74,6 +74,8 @@ enum {
#define IPPROTO_UDPLITE IPPROTO_UDPLITE #define IPPROTO_UDPLITE IPPROTO_UDPLITE
IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */ IPPROTO_MPLS = 137, /* MPLS in IP (RFC 4023) */
#define IPPROTO_MPLS IPPROTO_MPLS #define IPPROTO_MPLS IPPROTO_MPLS
IPPROTO_ETHERNET = 143, /* Ethernet-within-IPv6 Encapsulation */
#define IPPROTO_ETHERNET IPPROTO_ETHERNET
IPPROTO_RAW = 255, /* Raw IP packets */ IPPROTO_RAW = 255, /* Raw IP packets */
#define IPPROTO_RAW IPPROTO_RAW #define IPPROTO_RAW IPPROTO_RAW
IPPROTO_MPTCP = 262, /* Multipath TCP connection */ IPPROTO_MPTCP = 262, /* Multipath TCP connection */
......
...@@ -35,7 +35,7 @@ endif ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 { \ ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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 ...@@ -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
cc = getenv("CC")
cc_is_clang = b"clang version" in Popen([cc, "-v"], stderr=PIPE).stderr.readline()
def clang_has_option(option): def clang_has_option(option):
return [o for o in Popen(['clang', option], stderr=PIPE).stderr.readlines() if b"unknown argument" in o] == [ ] return [o for o in Popen([cc, option], stderr=PIPE).stderr.readlines() if b"unknown argument" in o] == [ ]
cc = getenv("CC") if cc_is_clang:
if cc == "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): ...@@ -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'
......
# 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),)
......
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