diff options
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/Makefile | 4 | ||||
| -rw-r--r-- | tools/perf/builtin-stat.c | 40 | ||||
| -rw-r--r-- | tools/perf/util/header.c | 2 | 
3 files changed, 38 insertions, 8 deletions
| diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 9bf3fc759344..92271d32bc30 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile @@ -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) $< diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index c941bb640f49..1e5e9b270f5e 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -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)); diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 4c7c2d73251f..c0b70c697a36 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -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) { | 
