aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorWang Nan <wangnan0@huawei.com>2016-07-14 04:34:36 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-07-15 16:27:46 -0400
commita4ea0ec4f24a721bea5447a27ad5fbcb89275bae (patch)
tree41798cc34f8481addad25a8a072847b5808443a6 /tools/perf
parent8db6d6b19e486eef3db41bbd74a1f4c2b82d7706 (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.c37
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
121static int 121static int
122rb_find_range(struct perf_evlist *evlist, 122rb_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
135static int record__mmap_read(struct record *rec, struct perf_evlist *evlist, int idx) 134static int
135record__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);
186out: 186out:
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
501static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist) 501static 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