On Mon, Aug 27, 2018 at 09:16:55PM +0300, Alexey Budankov wrote:

SNIP

> +     int trace_fd = rec->session->data->file.fd;
> +     struct aiocb **mmap_aio = rec->evlist->mmap_aio;
> +     int mmap_aio_size = 0;
> +     off_t off;
>  
>       if (!evlist)
>               return 0;
> @@ -528,14 +632,17 @@ 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;
>  
> +     off = lseek(trace_fd, 0, SEEK_CUR);
> +
>       for (i = 0; i < evlist->nr_mmaps; i++) {
>               struct auxtrace_mmap *mm = &maps[i].auxtrace_mmap;
>  
>               if (maps[i].base) {
> -                     if (perf_mmap__push(&maps[i], rec, record__pushfn) != 
> 0) {
> -                             rc = -1;
> +                     rc = perf_mmap__push(&maps[i], rec, record__pushfn, 
> &off);
> +                     if (rc < 0)
>                               goto out;
> -                     }
> +                     else if (rc > 0)
> +                             mmap_aio[mmap_aio_size++] = &maps[i].cblock;

I understand the purpose of mmap_aio array, but I don't see a reason
to fill it in every time we call record__mmap_read_evlist

the way I see it, when 'pushing the data' it's either all or nothing,

if there's an error in pushing one map, we bail out completely..
so the mmap_aio array could be preallocated (it is now) and
pre-filled with cblock pointers

that would probably ease up the reference counting I mentioned
in the previous email

thanks,
jirka

Reply via email to