Commit 8c1bee68 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:
 "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
parents 37820108 45bff41a
...@@ -338,6 +338,9 @@ int x86_setup_perfctr(struct perf_event *event) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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) ...@@ -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); ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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() ...@@ -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', ...@@ -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, ...@@ -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");
......
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