Skip to content

Commit a448a03

Browse files
author
Ingo Molnar
committed
Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Pull perf/urgent fixes from Arnaldo Carvalho de Melo: * The python binding needs to link with libtraceevent and to initialize the 'page_size' variable so that mmaping works again. * The callchain folding character that appears on the TUI just before the overhead had disappeared due to recent changes, add it back. * Intel PEBS in VT-x context uses the DS address as a guest linear address, even though its programmed by the host as a host linear address. This either results in guest memory corruption and or the hardware faulting and 'crashing' the virtual machine. Therefore we have to disable PEBS on VT-x enter and re-enable on VT-x exit, enforcing a strict exclude_guest. Kernel side enforcement fix by Peter Zijlstra, tooling side fix by David Ahern. * Fix build on sparc due to UAPI, fix from David Miller. * Fixes for the srclike sort key for unresolved symbols and when processing samples in JITted code, where we don't have an ELF file, just an special symbol table, fixes from Namhyung Kim. * Fix some leaks in libtraceevent, from Steven Rostedt. Signed-off-by: Arnaldo Carvalho de Melo <[email protected]> Signed-off-by: Ingo Molnar <[email protected]>
2 parents c9623de + 88a21d2 commit a448a03

File tree

9 files changed

+44
-6
lines changed

9 files changed

+44
-6
lines changed

arch/x86/kernel/cpu/perf_event.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,9 @@ int x86_setup_perfctr(struct perf_event *event)
338338
/* BTS is currently only allowed for user-mode. */
339339
if (!attr->exclude_kernel)
340340
return -EOPNOTSUPP;
341+
342+
if (!attr->exclude_guest)
343+
return -EOPNOTSUPP;
341344
}
342345

343346
hwc->config |= config;
@@ -380,6 +383,9 @@ int x86_pmu_hw_config(struct perf_event *event)
380383
if (event->attr.precise_ip) {
381384
int precise = 0;
382385

386+
if (!event->attr.exclude_guest)
387+
return -EOPNOTSUPP;
388+
383389
/* Support for constant skid */
384390
if (x86_pmu.pebs_active && !x86_pmu.pebs_broken) {
385391
precise++;

tools/lib/traceevent/event-parse.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2602,6 +2602,9 @@ find_func_handler(struct pevent *pevent, char *func_name)
26022602
{
26032603
struct pevent_function_handler *func;
26042604

2605+
if (!pevent)
2606+
return NULL;
2607+
26052608
for (func = pevent->func_handlers; func; func = func->next) {
26062609
if (strcmp(func->name, func_name) == 0)
26072610
break;
@@ -4938,6 +4941,9 @@ enum pevent_errno __pevent_parse_format(struct event_format **eventp,
49384941
goto event_alloc_failed;
49394942
}
49404943

4944+
/* Add pevent to event so that it can be referenced */
4945+
event->pevent = pevent;
4946+
49414947
ret = event_read_format(event);
49424948
if (ret < 0) {
49434949
ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
@@ -5041,9 +5047,6 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
50415047
if (event == NULL)
50425048
return ret;
50435049

5044-
/* Add pevent to event so that it can be referenced */
5045-
event->pevent = pevent;
5046-
50475050
if (add_event(pevent, event)) {
50485051
ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
50495052
goto event_add_failed;

tools/lib/traceevent/parse-filter.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,16 @@ static void free_arg(struct filter_arg *arg)
209209
switch (arg->type) {
210210
case FILTER_ARG_NONE:
211211
case FILTER_ARG_BOOLEAN:
212+
break;
213+
212214
case FILTER_ARG_NUM:
215+
free_arg(arg->num.left);
216+
free_arg(arg->num.right);
217+
break;
218+
219+
case FILTER_ARG_EXP:
220+
free_arg(arg->exp.left);
221+
free_arg(arg->exp.right);
213222
break;
214223

215224
case FILTER_ARG_STR:
@@ -218,6 +227,12 @@ static void free_arg(struct filter_arg *arg)
218227
free(arg->str.buffer);
219228
break;
220229

230+
case FILTER_ARG_VALUE:
231+
if (arg->value.type == FILTER_STRING ||
232+
arg->value.type == FILTER_CHAR)
233+
free(arg->value.str);
234+
break;
235+
221236
case FILTER_ARG_OP:
222237
free_arg(arg->op.left);
223238
free_arg(arg->op.right);

tools/perf/perf.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ void get_term_dimensions(struct winsize *ws);
5757
#endif
5858

5959
#ifdef __sparc__
60-
#include "../../arch/sparc/include/asm/unistd.h"
60+
#include "../../arch/sparc/include/uapi/asm/unistd.h"
6161
#define rmb() asm volatile("":::"memory")
6262
#define cpu_relax() asm volatile("":::"memory")
6363
#define CPUINFO_PROC "cpu"

tools/perf/ui/browsers/hists.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
610610
char folded_sign = ' ';
611611
bool current_entry = ui_browser__is_current_entry(&browser->b, row);
612612
off_t row_offset = entry->row_offset;
613+
bool first = true;
613614

614615
if (current_entry) {
615616
browser->he_selection = entry;
@@ -633,10 +634,11 @@ static int hist_browser__show_entry(struct hist_browser *browser,
633634
if (!perf_hpp__format[i].cond)
634635
continue;
635636

636-
if (i) {
637+
if (!first) {
637638
slsmg_printf(" ");
638639
width -= 2;
639640
}
641+
first = false;
640642

641643
if (perf_hpp__format[i].color) {
642644
hpp.ptr = &percent;
@@ -645,7 +647,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
645647

646648
ui_browser__set_percent_color(&browser->b, percent, current_entry);
647649

648-
if (i == 0 && symbol_conf.use_callchain) {
650+
if (i == PERF_HPP__OVERHEAD && symbol_conf.use_callchain) {
649651
slsmg_printf("%c ", folded_sign);
650652
width -= 2;
651653
}

tools/perf/util/parse-events.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,9 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
690690
eH = 0;
691691
} else if (*str == 'p') {
692692
precise++;
693+
/* use of precise requires exclude_guest */
694+
if (!exclude_GH)
695+
eG = 1;
693696
} else
694697
break;
695698

tools/perf/util/python.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,8 @@ PyMODINIT_FUNC initperf(void)
10151015
pyrf_cpu_map__setup_types() < 0)
10161016
return;
10171017

1018+
page_size = sysconf(_SC_PAGE_SIZE);
1019+
10181020
Py_INCREF(&pyrf_evlist__type);
10191021
PyModule_AddObject(module, "evlist", (PyObject*)&pyrf_evlist__type);
10201022

tools/perf/util/setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def finalize_options(self):
3131
sources = ext_sources,
3232
include_dirs = ['util/include'],
3333
extra_compile_args = cflags,
34+
extra_objects = [build_tmp + '/../../libtraceevent.a'],
3435
)
3536

3637
setup(name='perf',

tools/perf/util/sort.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,12 @@ static int hist_entry__srcline_snprintf(struct hist_entry *self, char *bf,
260260
if (path != NULL)
261261
goto out_path;
262262

263+
if (!self->ms.map)
264+
goto out_ip;
265+
266+
if (!strncmp(self->ms.map->dso->long_name, "/tmp/perf-", 10))
267+
goto out_ip;
268+
263269
snprintf(cmd, sizeof(cmd), "addr2line -e %s %016" PRIx64,
264270
self->ms.map->dso->long_name, self->ip);
265271
fp = popen(cmd, "r");

0 commit comments

Comments
 (0)