diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-07-14 04:34:33 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-07-15 12:38:06 -0400 |
commit | 32a951b4fd6bbe60ef5d65930b1712321e241b27 (patch) | |
tree | 6900abcdecfb044b93de799a1f7fcc01e9893ad4 /tools/perf | |
parent | db49120a32b347fb93aea3319305932657dd118c (diff) |
perf evlist: Drop redundant evsel->overwrite indicator
evsel->overwrite indicator means an event should be put into
overwritable ring buffer. In current implementation, it equals to
evsel->attr.write_backward. To reduce compliexity, remove
evsel->overwrite, use evsel->attr.write_backward instead.
In addition, in __perf_evsel__open(), if kernel doesn't support
write_backward and user explicitly set it in evsel, don't fallback
like other missing feature, since it is meaningless to fall back to
a forward ring buffer in this case: we are unable to stably read
from an forward overwritable ring buffer.
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: Nilay Vaish <nilayvaish@gmail.com>
Cc: Wang Nan <wangnan0@huawei.com>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468485287-33422-2-git-send-email-wangnan0@huawei.com
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/tests/backward-ring-buffer.c | 1 | ||||
-rw-r--r-- | tools/perf/util/evlist.c | 4 | ||||
-rw-r--r-- | tools/perf/util/evsel.c | 12 | ||||
-rw-r--r-- | tools/perf/util/evsel.h | 1 |
4 files changed, 8 insertions, 10 deletions
diff --git a/tools/perf/tests/backward-ring-buffer.c b/tools/perf/tests/backward-ring-buffer.c index f20ea4c0d0cb..5cee3873f2b5 100644 --- a/tools/perf/tests/backward-ring-buffer.c +++ b/tools/perf/tests/backward-ring-buffer.c | |||
@@ -101,6 +101,7 @@ int test__backward_ring_buffer(int subtest __maybe_unused) | |||
101 | return TEST_FAIL; | 101 | return TEST_FAIL; |
102 | } | 102 | } |
103 | 103 | ||
104 | evlist->backward = true; | ||
104 | err = perf_evlist__create_maps(evlist, &opts.target); | 105 | err = perf_evlist__create_maps(evlist, &opts.target); |
105 | if (err < 0) { | 106 | if (err < 0) { |
106 | pr_debug("Not enough memory to create thread/cpu maps\n"); | 107 | pr_debug("Not enough memory to create thread/cpu maps\n"); |
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index 862e69c2690d..6803f5ccd15e 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c | |||
@@ -1003,7 +1003,7 @@ static bool | |||
1003 | perf_evlist__should_poll(struct perf_evlist *evlist __maybe_unused, | 1003 | perf_evlist__should_poll(struct perf_evlist *evlist __maybe_unused, |
1004 | struct perf_evsel *evsel) | 1004 | struct perf_evsel *evsel) |
1005 | { | 1005 | { |
1006 | if (evsel->overwrite) | 1006 | if (evsel->attr.write_backward) |
1007 | return false; | 1007 | return false; |
1008 | return true; | 1008 | return true; |
1009 | } | 1009 | } |
@@ -1018,7 +1018,7 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx, | |||
1018 | evlist__for_each_entry(evlist, evsel) { | 1018 | evlist__for_each_entry(evlist, evsel) { |
1019 | int fd; | 1019 | int fd; |
1020 | 1020 | ||
1021 | if (evsel->overwrite != (evlist->overwrite && evlist->backward)) | 1021 | if (!!evsel->attr.write_backward != (evlist->overwrite && evlist->backward)) |
1022 | continue; | 1022 | continue; |
1023 | 1023 | ||
1024 | if (evsel->system_wide && thread) | 1024 | if (evsel->system_wide && thread) |
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index ba0f59fa3d5d..9ac2f92ce88d 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
@@ -1377,6 +1377,9 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, | |||
1377 | int pid = -1, err; | 1377 | int pid = -1, err; |
1378 | enum { NO_CHANGE, SET_TO_MAX, INCREASED_MAX } set_rlimit = NO_CHANGE; | 1378 | enum { NO_CHANGE, SET_TO_MAX, INCREASED_MAX } set_rlimit = NO_CHANGE; |
1379 | 1379 | ||
1380 | if (perf_missing_features.write_backward && evsel->attr.write_backward) | ||
1381 | return -EINVAL; | ||
1382 | |||
1380 | if (evsel->system_wide) | 1383 | if (evsel->system_wide) |
1381 | nthreads = 1; | 1384 | nthreads = 1; |
1382 | else | 1385 | else |
@@ -1407,11 +1410,6 @@ fallback_missing_features: | |||
1407 | if (perf_missing_features.lbr_flags) | 1410 | if (perf_missing_features.lbr_flags) |
1408 | evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS | | 1411 | evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS | |
1409 | PERF_SAMPLE_BRANCH_NO_CYCLES); | 1412 | PERF_SAMPLE_BRANCH_NO_CYCLES); |
1410 | if (perf_missing_features.write_backward) { | ||
1411 | if (evsel->overwrite) | ||
1412 | return -EINVAL; | ||
1413 | evsel->attr.write_backward = false; | ||
1414 | } | ||
1415 | retry_sample_id: | 1413 | retry_sample_id: |
1416 | if (perf_missing_features.sample_id_all) | 1414 | if (perf_missing_features.sample_id_all) |
1417 | evsel->attr.sample_id_all = 0; | 1415 | evsel->attr.sample_id_all = 0; |
@@ -1513,7 +1511,7 @@ try_fallback: | |||
1513 | */ | 1511 | */ |
1514 | if (!perf_missing_features.write_backward && evsel->attr.write_backward) { | 1512 | if (!perf_missing_features.write_backward && evsel->attr.write_backward) { |
1515 | perf_missing_features.write_backward = true; | 1513 | perf_missing_features.write_backward = true; |
1516 | goto fallback_missing_features; | 1514 | goto out_close; |
1517 | } else if (!perf_missing_features.clockid_wrong && evsel->attr.use_clockid) { | 1515 | } else if (!perf_missing_features.clockid_wrong && evsel->attr.use_clockid) { |
1518 | perf_missing_features.clockid_wrong = true; | 1516 | perf_missing_features.clockid_wrong = true; |
1519 | goto fallback_missing_features; | 1517 | goto fallback_missing_features; |
@@ -2422,7 +2420,7 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, | |||
2422 | "We found oprofile daemon running, please stop it and try again."); | 2420 | "We found oprofile daemon running, please stop it and try again."); |
2423 | break; | 2421 | break; |
2424 | case EINVAL: | 2422 | case EINVAL: |
2425 | if (evsel->overwrite && perf_missing_features.write_backward) | 2423 | if (evsel->attr.write_backward && perf_missing_features.write_backward) |
2426 | return scnprintf(msg, size, "Reading from overwrite event is not supported by this kernel."); | 2424 | return scnprintf(msg, size, "Reading from overwrite event is not supported by this kernel."); |
2427 | if (perf_missing_features.clockid) | 2425 | if (perf_missing_features.clockid) |
2428 | return scnprintf(msg, size, "clockid feature not supported."); | 2426 | return scnprintf(msg, size, "clockid feature not supported."); |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index d73391e8740e..e60cbfc2cd35 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -114,7 +114,6 @@ struct perf_evsel { | |||
114 | bool tracking; | 114 | bool tracking; |
115 | bool per_pkg; | 115 | bool per_pkg; |
116 | bool precise_max; | 116 | bool precise_max; |
117 | bool overwrite; | ||
118 | /* parse modifier helper */ | 117 | /* parse modifier helper */ |
119 | int exclude_GH; | 118 | int exclude_GH; |
120 | int nr_members; | 119 | int nr_members; |