forked from Minki/linux
perf evsel: Fix write_backwards fallback
Commitb90dc17a5d
"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:b90dc17a5d
("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>
This commit is contained in:
parent
0aab21363f
commit
7da36e94e7
@ -1389,8 +1389,11 @@ fallback_missing_features:
|
|||||||
if (perf_missing_features.lbr_flags)
|
if (perf_missing_features.lbr_flags)
|
||||||
evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS |
|
evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS |
|
||||||
PERF_SAMPLE_BRANCH_NO_CYCLES);
|
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;
|
evsel->attr.write_backward = false;
|
||||||
|
}
|
||||||
retry_sample_id:
|
retry_sample_id:
|
||||||
if (perf_missing_features.sample_id_all)
|
if (perf_missing_features.sample_id_all)
|
||||||
evsel->attr.sample_id_all = 0;
|
evsel->attr.sample_id_all = 0;
|
||||||
@ -1453,12 +1456,6 @@ retry_open:
|
|||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto out_close;
|
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
|
* Must probe features in the order they were added to the
|
||||||
* perf_event_attr interface.
|
* 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;
|
perf_missing_features.clockid_wrong = true;
|
||||||
goto fallback_missing_features;
|
goto fallback_missing_features;
|
||||||
} else if (!perf_missing_features.clockid && evsel->attr.use_clockid) {
|
} else if (!perf_missing_features.clockid && evsel->attr.use_clockid) {
|
||||||
@ -1521,12 +1521,7 @@ try_fallback:
|
|||||||
PERF_SAMPLE_BRANCH_NO_FLAGS))) {
|
PERF_SAMPLE_BRANCH_NO_FLAGS))) {
|
||||||
perf_missing_features.lbr_flags = true;
|
perf_missing_features.lbr_flags = true;
|
||||||
goto fallback_missing_features;
|
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:
|
out_close:
|
||||||
do {
|
do {
|
||||||
while (--thread >= 0) {
|
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.");
|
"We found oprofile daemon running, please stop it and try again.");
|
||||||
break;
|
break;
|
||||||
case EINVAL:
|
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)
|
if (perf_missing_features.clockid)
|
||||||
return scnprintf(msg, size, "clockid feature not supported.");
|
return scnprintf(msg, size, "clockid feature not supported.");
|
||||||
if (perf_missing_features.clockid_wrong)
|
if (perf_missing_features.clockid_wrong)
|
||||||
|
Loading…
Reference in New Issue
Block a user