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 <wangn...@huawei.com> Signed-off-by: He Kuang <heku...@huawei.com> Cc: Arnaldo Carvalho de Melo <a...@redhat.com> Cc: Jiri Olsa <jo...@kernel.org> Cc: Masami Hiramatsu <masami.hiramatsu...@hitachi.com> Cc: Namhyung Kim <namhy...@kernel.org> Cc: Zefan Li <lize...@huawei.com> Cc: pi3or...@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 92eccf1..120b3bb 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -462,6 +462,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; @@ -472,7 +485,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