perf evlist: Drop redundant evsel->overwrite indicator
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 14 Jul 2016 08:34:33 +0000 (08:34 +0000)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 15 Jul 2016 16:38:06 +0000 (13:38 -0300)
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>
tools/perf/tests/backward-ring-buffer.c
tools/perf/util/evlist.c
tools/perf/util/evsel.c
tools/perf/util/evsel.h

index f20ea4c0d0cb9c551c2726a23aa9857c6135882c..5cee3873f2b56bedb395f770e4ad47fe6105f657 100644 (file)
@@ -101,6 +101,7 @@ int test__backward_ring_buffer(int subtest __maybe_unused)
                return TEST_FAIL;
        }
 
+       evlist->backward = true;
        err = perf_evlist__create_maps(evlist, &opts.target);
        if (err < 0) {
                pr_debug("Not enough memory to create thread/cpu maps\n");
index 862e69c2690d17054b10b40b24741ffe0e4ed02c..6803f5ccd15e5412b7e6d75a299a8797e438aea8 100644 (file)
@@ -1003,7 +1003,7 @@ static bool
 perf_evlist__should_poll(struct perf_evlist *evlist __maybe_unused,
                         struct perf_evsel *evsel)
 {
-       if (evsel->overwrite)
+       if (evsel->attr.write_backward)
                return false;
        return true;
 }
@@ -1018,7 +1018,7 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,
        evlist__for_each_entry(evlist, evsel) {
                int fd;
 
-               if (evsel->overwrite != (evlist->overwrite && evlist->backward))
+               if (!!evsel->attr.write_backward != (evlist->overwrite && evlist->backward))
                        continue;
 
                if (evsel->system_wide && thread)
index ba0f59fa3d5dd247aa0a77bf945edfde68d03b8e..9ac2f92ce88de180a8b1ccac858eeb38c96e2567 100644 (file)
@@ -1377,6 +1377,9 @@ static int __perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,
        int pid = -1, err;
        enum { NO_CHANGE, SET_TO_MAX, INCREASED_MAX } set_rlimit = NO_CHANGE;
 
+       if (perf_missing_features.write_backward && evsel->attr.write_backward)
+               return -EINVAL;
+
        if (evsel->system_wide)
                nthreads = 1;
        else
@@ -1407,11 +1410,6 @@ 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 (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;
@@ -1513,7 +1511,7 @@ try_fallback:
         */
        if (!perf_missing_features.write_backward && evsel->attr.write_backward) {
                perf_missing_features.write_backward = true;
-               goto fallback_missing_features;
+               goto out_close;
        } else if (!perf_missing_features.clockid_wrong && evsel->attr.use_clockid) {
                perf_missing_features.clockid_wrong = true;
                goto fallback_missing_features;
@@ -2422,7 +2420,7 @@ 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)
+               if (evsel->attr.write_backward && 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.");
index d73391e8740e4fb32c0a0028306b9697f2b456a5..e60cbfc2cd3532edd489e76b69e4ba44a3f7ef1c 100644 (file)
@@ -114,7 +114,6 @@ struct perf_evsel {
        bool                    tracking;
        bool                    per_pkg;
        bool                    precise_max;
-       bool                    overwrite;
        /* parse modifier helper */
        int                     exclude_GH;
        int                     nr_members;