diff options
author | Wang Nan <wangnan0@huawei.com> | 2016-07-14 04:34:36 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-07-15 16:27:46 -0400 |
commit | a4ea0ec4f24a721bea5447a27ad5fbcb89275bae (patch) | |
tree | 41798cc34f8481addad25a8a072847b5808443a6 /tools/perf | |
parent | 8db6d6b19e486eef3db41bbd74a1f4c2b82d7706 (diff) |
perf record: Decouple record__mmap_read() and evlist.
Perf evlist will have multiple mmap arrays. Update record__mmap_read():
it should read from 'struct perf_mmap' directly.
Also, make record__mmap_read() ready to read from backward ring buffer.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: He Kuang <hekuang@huawei.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468485287-33422-5-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/builtin-record.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index d9f5cc3a3667..d15517e849a3 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -119,11 +119,10 @@ backward_rb_find_range(void *buf, int mask, u64 head, u64 *start, u64 *end) | |||
119 | } | 119 | } |
120 | 120 | ||
121 | static int | 121 | static int |
122 | rb_find_range(struct perf_evlist *evlist, | 122 | rb_find_range(void *data, int mask, u64 head, u64 old, |
123 | void *data, int mask, u64 head, u64 old, | 123 | u64 *start, u64 *end, bool backward) |
124 | u64 *start, u64 *end) | ||
125 | { | 124 | { |
126 | if (!evlist->backward) { | 125 | if (!backward) { |
127 | *start = old; | 126 | *start = old; |
128 | *end = head; | 127 | *end = head; |
129 | return 0; | 128 | return 0; |
@@ -132,9 +131,10 @@ rb_find_range(struct perf_evlist *evlist, | |||
132 | return backward_rb_find_range(data, mask, head, start, end); | 131 | return backward_rb_find_range(data, mask, head, start, end); |
133 | } | 132 | } |
134 | 133 | ||
135 | static int record__mmap_read(struct record *rec, struct perf_evlist *evlist, int idx) | 134 | static int |
135 | record__mmap_read(struct record *rec, struct perf_mmap *md, | ||
136 | bool overwrite, bool backward) | ||
136 | { | 137 | { |
137 | struct perf_mmap *md = &evlist->mmap[idx]; | ||
138 | u64 head = perf_mmap__read_head(md); | 138 | u64 head = perf_mmap__read_head(md); |
139 | u64 old = md->prev; | 139 | u64 old = md->prev; |
140 | u64 end = head, start = old; | 140 | u64 end = head, start = old; |
@@ -143,8 +143,8 @@ static int record__mmap_read(struct record *rec, struct perf_evlist *evlist, int | |||
143 | void *buf; | 143 | void *buf; |
144 | int rc = 0; | 144 | int rc = 0; |
145 | 145 | ||
146 | if (rb_find_range(evlist, data, md->mask, head, | 146 | if (rb_find_range(data, md->mask, head, |
147 | old, &start, &end)) | 147 | old, &start, &end, backward)) |
148 | return -1; | 148 | return -1; |
149 | 149 | ||
150 | if (start == end) | 150 | if (start == end) |
@@ -157,7 +157,7 @@ static int record__mmap_read(struct record *rec, struct perf_evlist *evlist, int | |||
157 | WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n"); | 157 | WARN_ONCE(1, "failed to keep up with mmap data. (warn only once)\n"); |
158 | 158 | ||
159 | md->prev = head; | 159 | md->prev = head; |
160 | perf_evlist__mmap_consume(evlist, idx); | 160 | perf_mmap__consume(md, overwrite || backward); |
161 | return 0; | 161 | return 0; |
162 | } | 162 | } |
163 | 163 | ||
@@ -182,7 +182,7 @@ static int record__mmap_read(struct record *rec, struct perf_evlist *evlist, int | |||
182 | } | 182 | } |
183 | 183 | ||
184 | md->prev = head; | 184 | md->prev = head; |
185 | perf_evlist__mmap_consume(evlist, idx); | 185 | perf_mmap__consume(md, overwrite || backward); |
186 | out: | 186 | out: |
187 | return rc; | 187 | return rc; |
188 | } | 188 | } |
@@ -498,20 +498,27 @@ static struct perf_event_header finished_round_event = { | |||
498 | .type = PERF_RECORD_FINISHED_ROUND, | 498 | .type = PERF_RECORD_FINISHED_ROUND, |
499 | }; | 499 | }; |
500 | 500 | ||
501 | static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist) | 501 | static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist, |
502 | bool backward) | ||
502 | { | 503 | { |
503 | u64 bytes_written = rec->bytes_written; | 504 | u64 bytes_written = rec->bytes_written; |
504 | int i; | 505 | int i; |
505 | int rc = 0; | 506 | int rc = 0; |
507 | struct perf_mmap *maps; | ||
506 | 508 | ||
507 | if (!evlist) | 509 | if (!evlist) |
508 | return 0; | 510 | return 0; |
509 | 511 | ||
512 | maps = evlist->mmap; | ||
513 | if (!maps) | ||
514 | return 0; | ||
515 | |||
510 | for (i = 0; i < evlist->nr_mmaps; i++) { | 516 | for (i = 0; i < evlist->nr_mmaps; i++) { |
511 | struct auxtrace_mmap *mm = &evlist->mmap[i].auxtrace_mmap; | 517 | struct auxtrace_mmap *mm = &maps[i].auxtrace_mmap; |
512 | 518 | ||
513 | if (evlist->mmap[i].base) { | 519 | if (maps[i].base) { |
514 | if (record__mmap_read(rec, evlist, i) != 0) { | 520 | if (record__mmap_read(rec, &maps[i], |
521 | evlist->overwrite, backward) != 0) { | ||
515 | rc = -1; | 522 | rc = -1; |
516 | goto out; | 523 | goto out; |
517 | } | 524 | } |
@@ -539,7 +546,7 @@ static int record__mmap_read_all(struct record *rec) | |||
539 | { | 546 | { |
540 | int err; | 547 | int err; |
541 | 548 | ||
542 | err = record__mmap_read_evlist(rec, rec->evlist); | 549 | err = record__mmap_read_evlist(rec, rec->evlist, false); |
543 | if (err) | 550 | if (err) |
544 | return err; | 551 | return err; |
545 | 552 | ||