Messages in this thread Patch in this message |  | | From | Wang Nan <> | Subject | [PATCH 44/55] perf record: Don't read from and poll overwrite channel | Date | Fri, 19 Feb 2016 11:44:32 +0000 |
| |
Reading from overwritable ring buffer is unreliable. Introduce record__mmap_should_read() and prevent reading from overwrite ring buffer in 'perf record'. The rule in record__mmap_should_read() will be changed when perf support reading from backward writing ring buffer.
Signed-off-by: Wang Nan <wangnan0@huawei.com> Signed-off-by: He Kuang <hekuang@huawei.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com --- tools/perf/builtin-record.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index f5bc5bf..b27b3ff 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -461,6 +461,19 @@ static struct perf_event_header finished_round_event = { .type = PERF_RECORD_FINISHED_ROUND, }; +static bool record__mmap_should_read(struct record *rec, int idx) +{ + int channel = -1; + + if (!rec->evlist->mmap[idx].base) + return false; + if (perf_evlist__channel_idx(rec->evlist, &channel, &idx)) + return false; + if (perf_evlist__channel_check(rec->evlist, channel, RDONLY)) + return false; + return true; +} + static int record__mmap_read_all(struct record *rec) { u64 bytes_written = rec->bytes_written; @@ -471,7 +484,7 @@ static int record__mmap_read_all(struct record *rec) for (i = 0; i < total_mmaps; i++) { struct auxtrace_mmap *mm = &rec->evlist->mmap[i].auxtrace_mmap; - if (rec->evlist->mmap[i].base) { + if (record__mmap_should_read(rec, i)) { if (record__mmap_read(rec, i) != 0) { rc = -1; goto out; -- 1.8.3.4
|  |