Messages in this thread | | | Date | Mon, 8 Oct 2018 12:52:54 +0200 | From | Jiri Olsa <> | Subject | Re: [PATCH v11 2/3]: perf record: enable asynchronous trace writing |
| |
On Mon, Oct 08, 2018 at 09:17:11AM +0300, Alexey Budankov wrote:
SNIP
> static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlist, > bool overwrite) > { > @@ -520,7 +644,10 @@ static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evli > int i; > int rc = 0; > struct perf_mmap *maps; > - > +#ifdef HAVE_AIO_SUPPORT > + int trace_fd = rec->data.file.fd; > + off_t off; > +#endif > if (!evlist) > return 0; > > @@ -531,14 +658,34 @@ static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evli > if (overwrite && evlist->bkw_mmap_state != BKW_MMAP_DATA_PENDING) > return 0; > > +#ifdef HAVE_AIO_SUPPORT > + off = lseek(trace_fd, 0, SEEK_CUR); > +#endif
I'm still little puzzled why we need to do this, when the aio write takes the offset value, but please provide some aio_.. function for this
> for (i = 0; i < evlist->nr_mmaps; i++) { > struct perf_mmap *map = &maps[i]; > > if (map->base) { > - if (perf_mmap__push(map, rec, record__pushfn) != 0) { > - rc = -1; > - goto out; > +#ifdef HAVE_AIO_SUPPORT > + if (!rec->opts.nr_cblocks) { > +#endif > + if (perf_mmap__push(map, rec, record__pushfn) != 0) { > + rc = -1; > + goto out; > + } > +#ifdef HAVE_AIO_SUPPORT > + } else { > + /* > + * Call record__aio_sync() to wait till map->data buffer > + * becomes available after previous aio write request. > + */ > + record__aio_sync(map); > + if (perf_mmap__aio_push(map, rec, record__aio_pushfn, &off) != 0) { > + lseek(trace_fd, off, SEEK_SET); > + rc = -1; > + goto out; > + } > } > +#endif > } > > if (map->auxtrace_mmap.base && !rec->opts.auxtrace_snapshot_mode && > @@ -547,7 +694,9 @@ static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evli > goto out; > } > } > - > +#ifdef HAVE_AIO_SUPPORT > + lseek(trace_fd, off, SEEK_SET); > +#endif
ditto
thanks, jirka
| |