diff options
author | Wang Nan <wangnan0@huawei.com> | 2016-05-20 12:38:23 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-05-20 13:54:23 -0400 |
commit | b90dc17a5d14a881f9bb3b58edb3d71075d58afb (patch) | |
tree | e621aa3d42c009475f758375b76d4ef755520bd6 /tools/perf | |
parent | 408cf677073a5d1a7343bc6430a7297ba7b280d4 (diff) |
perf evsel: Add overwrite attribute and check write_backward
Add 'overwrite' attribute to evsel to mark whether this event is
overwritable. The following commits will support syntax like:
# perf record -e cycles/overwrite/ ...
An overwritable evsel requires kernel support for the
perf_event_attr.write_backward ring buffer feature.
Add it to perf_missing_feature.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
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
Link: http://lkml.kernel.org/r/1463762315-155689-2-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/evsel.c | 13 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 1 |
2 files changed, 14 insertions, 0 deletions
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 964c7c3602c0..02c177d14c8d 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -37,6 +37,7 @@ static struct { | |||
37 | bool clockid; | 37 | bool clockid; |
38 | bool clockid_wrong; | 38 | bool clockid_wrong; |
39 | bool lbr_flags; | 39 | bool lbr_flags; |
40 | bool write_backward; | ||
40 | } perf_missing_features; | 41 | } perf_missing_features; |
41 | 42 | ||
42 | static clockid_t clockid; | 43 | static clockid_t clockid; |
@@ -1376,6 +1377,8 @@ fallback_missing_features: | |||
1376 | if (perf_missing_features.lbr_flags) | 1377 | if (perf_missing_features.lbr_flags) |
1377 | evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS | | 1378 | evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS | |
1378 | PERF_SAMPLE_BRANCH_NO_CYCLES); | 1379 | PERF_SAMPLE_BRANCH_NO_CYCLES); |
1380 | if (perf_missing_features.write_backward) | ||
1381 | evsel->attr.write_backward = false; | ||
1379 | retry_sample_id: | 1382 | retry_sample_id: |
1380 | if (perf_missing_features.sample_id_all) | 1383 | if (perf_missing_features.sample_id_all) |
1381 | evsel->attr.sample_id_all = 0; | 1384 | evsel->attr.sample_id_all = 0; |
@@ -1438,6 +1441,12 @@ retry_open: | |||
1438 | err = -EINVAL; | 1441 | err = -EINVAL; |
1439 | goto out_close; | 1442 | goto out_close; |
1440 | } | 1443 | } |
1444 | |||
1445 | if (evsel->overwrite && | ||
1446 | perf_missing_features.write_backward) { | ||
1447 | err = -EINVAL; | ||
1448 | goto out_close; | ||
1449 | } | ||
1441 | } | 1450 | } |
1442 | } | 1451 | } |
1443 | 1452 | ||
@@ -1500,6 +1509,10 @@ try_fallback: | |||
1500 | PERF_SAMPLE_BRANCH_NO_FLAGS))) { | 1509 | PERF_SAMPLE_BRANCH_NO_FLAGS))) { |
1501 | perf_missing_features.lbr_flags = true; | 1510 | perf_missing_features.lbr_flags = true; |
1502 | goto fallback_missing_features; | 1511 | goto fallback_missing_features; |
1512 | } else if (!perf_missing_features.write_backward && | ||
1513 | evsel->attr.write_backward) { | ||
1514 | perf_missing_features.write_backward = true; | ||
1515 | goto fallback_missing_features; | ||
1503 | } | 1516 | } |
1504 | 1517 | ||
1505 | out_close: | 1518 | out_close: |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 8a644fef452c..c1f10159804c 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -112,6 +112,7 @@ struct perf_evsel { | |||
112 | bool tracking; | 112 | bool tracking; |
113 | bool per_pkg; | 113 | bool per_pkg; |
114 | bool precise_max; | 114 | bool precise_max; |
115 | bool overwrite; | ||
115 | /* parse modifier helper */ | 116 | /* parse modifier helper */ |
116 | int exclude_GH; | 117 | int exclude_GH; |
117 | int nr_members; | 118 | int nr_members; |