mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar: "Assorted small fixes" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf python: Properly link with libtraceevent perf hists browser: Add back callchain folding symbol perf tools: Fix build on sparc. perf python: Link with libtraceevent perf python: Initialize 'page_size' variable tools lib traceevent: Fix missed freeing of subargs in free_arg() in filter lib tools traceevent: Add back pevent assignment in __pevent_parse_format() perf hists browser: Fix off-by-two bug on the first column perf tools: Remove warnings on JIT samples for srcline sort key perf tools: Fix segfault when using srcline sort key perf: Require exclude_guest to use PEBS - kernel side enforcement perf tool: Precise mode requires exclude_guest
This commit is contained in:
commit
8c1bee685e
9 changed files with 56 additions and 17 deletions
|
@ -338,6 +338,9 @@ int x86_setup_perfctr(struct perf_event *event)
|
||||||
/* BTS is currently only allowed for user-mode. */
|
/* BTS is currently only allowed for user-mode. */
|
||||||
if (!attr->exclude_kernel)
|
if (!attr->exclude_kernel)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (!attr->exclude_guest)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
hwc->config |= config;
|
hwc->config |= config;
|
||||||
|
@ -380,6 +383,9 @@ int x86_pmu_hw_config(struct perf_event *event)
|
||||||
if (event->attr.precise_ip) {
|
if (event->attr.precise_ip) {
|
||||||
int precise = 0;
|
int precise = 0;
|
||||||
|
|
||||||
|
if (!event->attr.exclude_guest)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
/* Support for constant skid */
|
/* Support for constant skid */
|
||||||
if (x86_pmu.pebs_active && !x86_pmu.pebs_broken) {
|
if (x86_pmu.pebs_active && !x86_pmu.pebs_broken) {
|
||||||
precise++;
|
precise++;
|
||||||
|
|
|
@ -2602,6 +2602,9 @@ find_func_handler(struct pevent *pevent, char *func_name)
|
||||||
{
|
{
|
||||||
struct pevent_function_handler *func;
|
struct pevent_function_handler *func;
|
||||||
|
|
||||||
|
if (!pevent)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
for (func = pevent->func_handlers; func; func = func->next) {
|
for (func = pevent->func_handlers; func; func = func->next) {
|
||||||
if (strcmp(func->name, func_name) == 0)
|
if (strcmp(func->name, func_name) == 0)
|
||||||
break;
|
break;
|
||||||
|
@ -4938,6 +4941,9 @@ enum pevent_errno __pevent_parse_format(struct event_format **eventp,
|
||||||
goto event_alloc_failed;
|
goto event_alloc_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add pevent to event so that it can be referenced */
|
||||||
|
event->pevent = pevent;
|
||||||
|
|
||||||
ret = event_read_format(event);
|
ret = event_read_format(event);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
|
ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
|
||||||
|
@ -5041,9 +5047,6 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
|
||||||
if (event == NULL)
|
if (event == NULL)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* Add pevent to event so that it can be referenced */
|
|
||||||
event->pevent = pevent;
|
|
||||||
|
|
||||||
if (add_event(pevent, event)) {
|
if (add_event(pevent, event)) {
|
||||||
ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
|
ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
|
||||||
goto event_add_failed;
|
goto event_add_failed;
|
||||||
|
|
|
@ -209,7 +209,16 @@ static void free_arg(struct filter_arg *arg)
|
||||||
switch (arg->type) {
|
switch (arg->type) {
|
||||||
case FILTER_ARG_NONE:
|
case FILTER_ARG_NONE:
|
||||||
case FILTER_ARG_BOOLEAN:
|
case FILTER_ARG_BOOLEAN:
|
||||||
|
break;
|
||||||
|
|
||||||
case FILTER_ARG_NUM:
|
case FILTER_ARG_NUM:
|
||||||
|
free_arg(arg->num.left);
|
||||||
|
free_arg(arg->num.right);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FILTER_ARG_EXP:
|
||||||
|
free_arg(arg->exp.left);
|
||||||
|
free_arg(arg->exp.right);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FILTER_ARG_STR:
|
case FILTER_ARG_STR:
|
||||||
|
@ -218,6 +227,12 @@ static void free_arg(struct filter_arg *arg)
|
||||||
free(arg->str.buffer);
|
free(arg->str.buffer);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FILTER_ARG_VALUE:
|
||||||
|
if (arg->value.type == FILTER_STRING ||
|
||||||
|
arg->value.type == FILTER_CHAR)
|
||||||
|
free(arg->value.str);
|
||||||
|
break;
|
||||||
|
|
||||||
case FILTER_ARG_OP:
|
case FILTER_ARG_OP:
|
||||||
free_arg(arg->op.left);
|
free_arg(arg->op.left);
|
||||||
free_arg(arg->op.right);
|
free_arg(arg->op.right);
|
||||||
|
|
|
@ -184,9 +184,22 @@ SCRIPT_SH += perf-archive.sh
|
||||||
grep-libs = $(filter -l%,$(1))
|
grep-libs = $(filter -l%,$(1))
|
||||||
strip-libs = $(filter-out -l%,$(1))
|
strip-libs = $(filter-out -l%,$(1))
|
||||||
|
|
||||||
|
TRACE_EVENT_DIR = ../lib/traceevent/
|
||||||
|
|
||||||
|
ifneq ($(OUTPUT),)
|
||||||
|
TE_PATH=$(OUTPUT)
|
||||||
|
else
|
||||||
|
TE_PATH=$(TRACE_EVENT_DIR)
|
||||||
|
endif
|
||||||
|
|
||||||
|
LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
|
||||||
|
TE_LIB := -L$(TE_PATH) -ltraceevent
|
||||||
|
|
||||||
PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
|
PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
|
||||||
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py
|
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py
|
||||||
|
|
||||||
|
export LIBTRACEEVENT
|
||||||
|
|
||||||
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS)
|
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS)
|
||||||
$(QUIET_GEN)CFLAGS='$(BASIC_CFLAGS)' $(PYTHON_WORD) util/setup.py \
|
$(QUIET_GEN)CFLAGS='$(BASIC_CFLAGS)' $(PYTHON_WORD) util/setup.py \
|
||||||
--quiet build_ext; \
|
--quiet build_ext; \
|
||||||
|
@ -198,17 +211,6 @@ $(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS)
|
||||||
|
|
||||||
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
|
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
|
||||||
|
|
||||||
TRACE_EVENT_DIR = ../lib/traceevent/
|
|
||||||
|
|
||||||
ifneq ($(OUTPUT),)
|
|
||||||
TE_PATH=$(OUTPUT)
|
|
||||||
else
|
|
||||||
TE_PATH=$(TRACE_EVENT_DIR)
|
|
||||||
endif
|
|
||||||
|
|
||||||
LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
|
|
||||||
TE_LIB := -L$(TE_PATH) -ltraceevent
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Single 'perf' binary right now:
|
# Single 'perf' binary right now:
|
||||||
#
|
#
|
||||||
|
|
|
@ -57,7 +57,7 @@ void get_term_dimensions(struct winsize *ws);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __sparc__
|
#ifdef __sparc__
|
||||||
#include "../../arch/sparc/include/asm/unistd.h"
|
#include "../../arch/sparc/include/uapi/asm/unistd.h"
|
||||||
#define rmb() asm volatile("":::"memory")
|
#define rmb() asm volatile("":::"memory")
|
||||||
#define cpu_relax() asm volatile("":::"memory")
|
#define cpu_relax() asm volatile("":::"memory")
|
||||||
#define CPUINFO_PROC "cpu"
|
#define CPUINFO_PROC "cpu"
|
||||||
|
|
|
@ -610,6 +610,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
|
||||||
char folded_sign = ' ';
|
char folded_sign = ' ';
|
||||||
bool current_entry = ui_browser__is_current_entry(&browser->b, row);
|
bool current_entry = ui_browser__is_current_entry(&browser->b, row);
|
||||||
off_t row_offset = entry->row_offset;
|
off_t row_offset = entry->row_offset;
|
||||||
|
bool first = true;
|
||||||
|
|
||||||
if (current_entry) {
|
if (current_entry) {
|
||||||
browser->he_selection = entry;
|
browser->he_selection = entry;
|
||||||
|
@ -633,10 +634,11 @@ static int hist_browser__show_entry(struct hist_browser *browser,
|
||||||
if (!perf_hpp__format[i].cond)
|
if (!perf_hpp__format[i].cond)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (i) {
|
if (!first) {
|
||||||
slsmg_printf(" ");
|
slsmg_printf(" ");
|
||||||
width -= 2;
|
width -= 2;
|
||||||
}
|
}
|
||||||
|
first = false;
|
||||||
|
|
||||||
if (perf_hpp__format[i].color) {
|
if (perf_hpp__format[i].color) {
|
||||||
hpp.ptr = &percent;
|
hpp.ptr = &percent;
|
||||||
|
@ -645,7 +647,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
|
||||||
|
|
||||||
ui_browser__set_percent_color(&browser->b, percent, current_entry);
|
ui_browser__set_percent_color(&browser->b, percent, current_entry);
|
||||||
|
|
||||||
if (i == 0 && symbol_conf.use_callchain) {
|
if (i == PERF_HPP__OVERHEAD && symbol_conf.use_callchain) {
|
||||||
slsmg_printf("%c ", folded_sign);
|
slsmg_printf("%c ", folded_sign);
|
||||||
width -= 2;
|
width -= 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -690,6 +690,9 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
|
||||||
eH = 0;
|
eH = 0;
|
||||||
} else if (*str == 'p') {
|
} else if (*str == 'p') {
|
||||||
precise++;
|
precise++;
|
||||||
|
/* use of precise requires exclude_guest */
|
||||||
|
if (!exclude_GH)
|
||||||
|
eG = 1;
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ cflags += getenv('CFLAGS', '').split()
|
||||||
|
|
||||||
build_lib = getenv('PYTHON_EXTBUILD_LIB')
|
build_lib = getenv('PYTHON_EXTBUILD_LIB')
|
||||||
build_tmp = getenv('PYTHON_EXTBUILD_TMP')
|
build_tmp = getenv('PYTHON_EXTBUILD_TMP')
|
||||||
|
libtraceevent = getenv('LIBTRACEEVENT')
|
||||||
|
|
||||||
ext_sources = [f.strip() for f in file('util/python-ext-sources')
|
ext_sources = [f.strip() for f in file('util/python-ext-sources')
|
||||||
if len(f.strip()) > 0 and f[0] != '#']
|
if len(f.strip()) > 0 and f[0] != '#']
|
||||||
|
@ -31,6 +32,7 @@ perf = Extension('perf',
|
||||||
sources = ext_sources,
|
sources = ext_sources,
|
||||||
include_dirs = ['util/include'],
|
include_dirs = ['util/include'],
|
||||||
extra_compile_args = cflags,
|
extra_compile_args = cflags,
|
||||||
|
extra_objects = [libtraceevent],
|
||||||
)
|
)
|
||||||
|
|
||||||
setup(name='perf',
|
setup(name='perf',
|
||||||
|
|
|
@ -260,6 +260,12 @@ static int hist_entry__srcline_snprintf(struct hist_entry *self, char *bf,
|
||||||
if (path != NULL)
|
if (path != NULL)
|
||||||
goto out_path;
|
goto out_path;
|
||||||
|
|
||||||
|
if (!self->ms.map)
|
||||||
|
goto out_ip;
|
||||||
|
|
||||||
|
if (!strncmp(self->ms.map->dso->long_name, "/tmp/perf-", 10))
|
||||||
|
goto out_ip;
|
||||||
|
|
||||||
snprintf(cmd, sizeof(cmd), "addr2line -e %s %016" PRIx64,
|
snprintf(cmd, sizeof(cmd), "addr2line -e %s %016" PRIx64,
|
||||||
self->ms.map->dso->long_name, self->ip);
|
self->ms.map->dso->long_name, self->ip);
|
||||||
fp = popen(cmd, "r");
|
fp = popen(cmd, "r");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue