diff options
| author | Arnaldo Carvalho de Melo <acme@kernel.org> | 2016-06-20 10:47:18 +0000 | 
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-06-21 13:18:35 -0300 | 
| commit | 7da36e94e7fad768ca8640b61ed1f49b284e1dc5 (patch) | |
| tree | bb469c4e412e72259e460da85533b7595f9ca5d4 /tools | |
| parent | 0aab21363ffa66d6e7340bc50cc5bfae865fd1a6 (diff) | |
perf evsel: Fix write_backwards fallback
Commit b90dc17a5d14 "perf evsel: Add overwrite attribute and check
write_backward" misunderstood the 'order' should be obeyed in
__perf_evsel__open.
But the way this was done for attr.write_backwards was buggy, as we need
to check features in the inverse order of their introduction to the
kernel, so that a newer tool checks first the newest perf_event_attr
fields, detecting that the older kernel doesn't have support for them.
Also, we can avoid calling sys_perf_event_open() if we have already
detected the missing of write_backward.
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Fixes: b90dc17a5d14 ("perf evsel: Add overwrite attribute and check write_backward")
Link: http://lkml.kernel.org/r/1466419645-75551-2-git-send-email-wangnan0@huawei.com
Link: http://lkml.kernel.org/r/20160616214724.GI13337@kernel.org
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/util/evsel.c | 23 | 
1 files changed, 10 insertions, 13 deletions
| diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 9b2e3e624efe..1d8f2bbd38a7 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1389,8 +1389,11 @@ fallback_missing_features:  	if (perf_missing_features.lbr_flags)  		evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS |  				     PERF_SAMPLE_BRANCH_NO_CYCLES); -	if (perf_missing_features.write_backward) +	if (perf_missing_features.write_backward) { +		if (evsel->overwrite) +			return -EINVAL;  		evsel->attr.write_backward = false; +	}  retry_sample_id:  	if (perf_missing_features.sample_id_all)  		evsel->attr.sample_id_all = 0; @@ -1453,12 +1456,6 @@ retry_open:  				err = -EINVAL;  				goto out_close;  			} - -			if (evsel->overwrite && -			    perf_missing_features.write_backward) { -				err = -EINVAL; -				goto out_close; -			}  		}  	} @@ -1496,7 +1493,10 @@ try_fallback:  	 * Must probe features in the order they were added to the  	 * perf_event_attr interface.  	 */ -	if (!perf_missing_features.clockid_wrong && evsel->attr.use_clockid) { +	if (!perf_missing_features.write_backward && evsel->attr.write_backward) { +		perf_missing_features.write_backward = true; +		goto fallback_missing_features; +	} else if (!perf_missing_features.clockid_wrong && evsel->attr.use_clockid) {  		perf_missing_features.clockid_wrong = true;  		goto fallback_missing_features;  	} else if (!perf_missing_features.clockid && evsel->attr.use_clockid) { @@ -1521,12 +1521,7 @@ try_fallback:  			  PERF_SAMPLE_BRANCH_NO_FLAGS))) {  		perf_missing_features.lbr_flags = true;  		goto fallback_missing_features; -	} else if (!perf_missing_features.write_backward && -			evsel->attr.write_backward) { -		perf_missing_features.write_backward = true; -		goto fallback_missing_features;  	} -  out_close:  	do {  		while (--thread >= 0) { @@ -2409,6 +2404,8 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target,  	"We found oprofile daemon running, please stop it and try again.");  		break;  	case EINVAL: +		if (evsel->overwrite && perf_missing_features.write_backward) +			return scnprintf(msg, size, "Reading from overwrite event is not supported by this kernel.");  		if (perf_missing_features.clockid)  			return scnprintf(msg, size, "clockid feature not supported.");  		if (perf_missing_features.clockid_wrong) | 
