On Thu, Dec 21, 2017 at 10:08:44AM -0800, [email protected] wrote:

SNIP

> +/*
> + * Report the start and end of the available data in ringbuffer
> + */
> +int perf_mmap__read_init(struct perf_mmap *map, bool overwrite,
> +                      u64 *start, u64 *end)
>  {
> -     u64 head = perf_mmap__read_head(md);
> -     u64 old = md->prev;
> -     u64 end = head, start = old;
> -     unsigned char *data = md->base + page_size;
> +     u64 head = perf_mmap__read_head(map);
> +     u64 old = map->prev;
> +     unsigned char *data = map->base + page_size;
>       unsigned long size;
> -     void *buf;
> -     int rc = 0;
>  
> -     start = overwrite ? head : old;
> -     end = overwrite ? old : head;
> +     /*
> +      * Check if event was unmapped due to a POLLHUP/POLLERR.
> +      */
> +     if (!refcount_read(&map->refcnt))
> +             return -EINVAL;
>  
> -     if (start == end)
> -             return 0;
> +     *start = overwrite ? head : old;
> +     *end = overwrite ? old : head;
>  
> -     size = end - start;
> -     if (size > (unsigned long)(md->mask) + 1) {
> +     if (*start == *end)
> +             return -EAGAIN;
> +
> +     size = *end - *start;
> +     if (size > (unsigned long)(map->mask) + 1) {
>               if (!overwrite) {
>                       WARN_ONCE(1, "failed to keep up with mmap data. (warn 
> only once)\n");
>  

I know you did not change this, but is this leg even possible
in !overwrite mode? I think kernel will throw away the data,
keep the head and wait for tail to be read by user..

jirka

> -                     md->prev = head;
> -                     perf_mmap__consume(md, overwrite);
> -                     return 0;
> +                     map->prev = head;
> +                     perf_mmap__consume(map, overwrite);
> +                     return -EAGAIN;

SNIP

Reply via email to