perf fixes
Subsystems (3)
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus
HEAD: 9b63776fa3ca96c4ecda76f6fa947b7b0add66ac tracing: Do not enable function event with enable
Thanks,
Ingo
------------------>
David Ahern (1):
perf stat: handle ENXIO error for perf_event_open
Greg Kroah-Hartman (1):
perf: Turn off compiler warnings for flex and bison generated files
Namhyung Kim (1):
perf build-id: Fix filename size calculation
Stephane Eranian (1):
perf stat: Fix case where guest/host monitoring is not supported by kernel
Steven Rostedt (1):
tracing: Do not enable function event with enable
include/linux/ftrace_event.h | 2 ++ kernel/trace/trace_events.c | 5 ++++- kernel/trace/trace_export.c | 1 + tools/perf/Makefile | 4 ++-- tools/perf/builtin-stat.c | 40 +++++++++++++++++++++++++++++++++++----- tools/perf/util/header.c | 2 +- 6 files changed, 45 insertions(+), 9 deletions(-)
include/linux/ftrace_event.h +2 -0
@@ -179,6 +179,7 @@ enum {TRACE_EVENT_FL_RECORDED_CMD_BIT ,TRACE_EVENT_FL_CAP_ANY_BIT ,TRACE_EVENT_FL_NO_SET_FILTER_BIT , + TRACE_EVENT_FL_IGNORE_ENABLE_BIT, }; enum {
@@ -187,6 +188,7 @@ enum {TRACE_EVENT_FL_RECORDED_CMD = (1 <<TRACE_EVENT_FL_RECORDED_CMD_BIT ),TRACE_EVENT_FL_CAP_ANY = (1 <<TRACE_EVENT_FL_CAP_ANY_BIT ),TRACE_EVENT_FL_NO_SET_FILTER = (1 <<TRACE_EVENT_FL_NO_SET_FILTER_BIT ), + TRACE_EVENT_FL_IGNORE_ENABLE = (1 << TRACE_EVENT_FL_IGNORE_ENABLE_BIT), }; struct ftrace_event_call {
kernel/trace/trace_events.c +4 -1
@@ -294,6 +294,9 @@ static int __ftrace_set_clr_event(const char *match, const char *sub,if (!call->name || !call->class || !call->class->reg)continue ; +if (call->flags &TRACE_EVENT_FL_IGNORE_ENABLE ) +continue ; +if (match &&strcmp (match, call->name) !=0 &&strcmp (match, call->class->system) !=0 )
@@ -1164,7 +1167,7 @@ event_create_dir(struct ftrace_event_call *call, struct dentry *d_events,return -1 ; } -if (call->class->reg) +if (call->class->reg && !(call->flags &TRACE_EVENT_FL_IGNORE_ENABLE ))trace_create_file ("enable" ,0644 , call->dir, call, enable);
kernel/trace/trace_export.c +1 -0
@@ -180,6 +180,7 @@ struct ftrace_event_call __used event_##call = { \ .event.type = etype, \ .class = &event_class_ftrace_##call, \ .print_fmt = print, \ + .flags = TRACE_EVENT_FL_IGNORE_ENABLE, \ }; \ struct ftrace_event_call __used \ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call;
tools/perf/Makefile +2 -2
@@ -774,10 +774,10 @@ $(OUTPUT)perf.o perf.spec \ # over the general rule for .o $(OUTPUT)util/%-flex.o: $(OUTPUT)util/%-flex.c $(OUTPUT)PERF-CFLAGS - $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Iutil/ -Wno-redundant-decls -Wno-switch-default -Wno-unused-function $< + $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Iutil/ -w $< $(OUTPUT)util/%-bison.o: $(OUTPUT)util/%-bison.c $(OUTPUT)PERF-CFLAGS - $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0 -Iutil/ -Wno-redundant-decls -Wno-switch-default -Wno-unused-function $< + $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0 -Iutil/ -w $< $(OUTPUT)%.o: %.c $(OUTPUT)PERF-CFLAGS $(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
tools/perf/builtin-stat.c +35 -5
@@ -283,6 +283,8 @@ static int create_perf_stat_counter(struct perf_evsel *evsel, {struct perf_event_attr *attr = &evsel->attr;struct xyarray *group_fd =NULL ; +bool exclude_guest_missing = false; +int ret;if (group && evsel != first) group_fd = first->fd;
@@ -293,16 +295,39 @@ static int create_perf_stat_counter(struct perf_evsel *evsel, attr->inherit = !no_inherit; -if (system_wide) -return perf_evsel__open_per_cpu (evsel, evsel_list->cpus, +retry: +if (exclude_guest_missing) + evsel->attr.exclude_guest = evsel->attr.exclude_host =0 ; + +if (system_wide) { + ret =perf_evsel__open_per_cpu (evsel, evsel_list->cpus, group, group_fd); +if (ret) + goto check_ret; +return 0 ; + } +if (!target_pid && !target_tid && (!group || evsel == first)) { attr->disabled =1 ; attr->enable_on_exec =1 ; } -return perf_evsel__open_per_thread (evsel, evsel_list->threads, - group, group_fd); + ret =perf_evsel__open_per_thread (evsel, evsel_list->threads, + group, group_fd); +if (!ret) +return 0 ; +/* fall through */ +check_ret: +if (ret && errno ==EINVAL ) { +if (!exclude_guest_missing && + (evsel->attr.exclude_guest || evsel->attr.exclude_host)) { +pr_debug ("Old kernel, cannot exclude " +"guest or host samples.\n" ); + exclude_guest_missing = true; + goto retry; + } + } +return ret; }/*
@@ -463,8 +488,13 @@ static int run_perf_stat(int argc __used, const char **argv)list_for_each_entry (counter, &evsel_list->entries, node) {if (create_perf_stat_counter (counter, first) <0 ) { +/* +* PPC returns ENXIO for HW counters until 2.6.37 +* (behavior changed with commit b0a873e). +*/ if (errno ==EINVAL || errno ==ENOSYS || - errno ==ENOENT || errno ==EOPNOTSUPP ) { + errno ==ENOENT || errno ==EOPNOTSUPP || + errno ==ENXIO ) {if (verbose)ui__warning ("%s event is not supported by the kernel.\n" ,event_name (counter));
tools/perf/util/header.c +1 -1
@@ -296,7 +296,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,if (mkdir_p (filename,0755 )) goto out_free; -snprintf (filename + len,sizeof (filename) - len,"/%s" , sbuild_id); +snprintf (filename + len, size - len,"/%s" , sbuild_id);if (access (filename,F_OK )) {if (is_kallsyms) {