Re: [PATCH v1 2/2]: perf record: enable asynchronous trace writing

From: Jiri Olsa
Date: Sun Aug 26 2018 - 17:54:02 EST


On Tue, Aug 21, 2018 at 11:27:03AM +0300, Alexey Budankov wrote:

SNIP

> -static int record__pushfn(void *to, void *bf, size_t size)
> +static int record__pushfn(void *to, void *bf, size_t size, off_t off)
> {
> struct record *rec = to;
> + struct perf_mmap *map = bf;
>
> rec->samples++;
> - return record__write(rec, bf, size);
> + return record__aio_write(rec->session->data->file.fd, &map->cblock,
> + map->data, size, off);
> }
>
> static volatile int done;
> @@ -528,13 +530,85 @@ static struct perf_event_header finished_round_event = {
> .type = PERF_RECORD_FINISHED_ROUND,
> };
>
> +static int record__mmap_read_sync(int trace_fd, struct aiocb **cblocks,
> + int cblocks_size, struct record *rec)
> +{
> + size_t rem;
> + ssize_t size;
> + off_t rem_off;
> + int i, aio_ret, aio_errno, do_suspend;
> + struct perf_mmap *md;
> + struct timespec timeout0 = { 0, 0 };
> + struct timespec timeoutS = { 0, 1000 * 500 * 1 };
> +
> + if (!cblocks_size)
> + return 0;
> +
> + do {
> + do_suspend = 0;
> + nanosleep(&timeoutS, NULL);

why the extra sleep in here and not sleeping through aio_suspend call?

jirka

> + if (aio_suspend((const struct aiocb**)cblocks, cblocks_size, &timeout0)) {
> + if (errno == EAGAIN || errno == EINTR) {
> + do_suspend = 1;
> + continue;
> + } else {
> + pr_err("failed to sync perf data, error: %m\n");

SNIP