On Fri, Dec 04, 2015 at 06:02:06PM +0100, Peter Zijlstra wrote:
> The only solution I've come up with is:
> 
>       struct rb_aux *aux = rb->aux;
> 
>       if (aux && vma->vm_pgoff == aux->pgoff) {
>               ctx = perf_event_ctx_lock(event);

Can't do this at all, see the comment in put_event(). perf_read_group()
accesses user memory (and hence causes faults, which in turn take
mmap_sem) while holding ctx::mutex.

So neither this, not what you proposed can work.

Will need moar thinking.

>               if (!atomic_dec_and_mutex_lock(&aux->mmap_count, 
> &event->mmap_mutex) {
>                       /* we now hold both ctx::mutex and event::mmap_mutex */
>                       rb->aux = NULL;
>                       ring_buffer_put(rb); /* aux had a reference */
>                       _perf_event_stop(event);
>                       ring_buffer_put_aux(aux); /* should be last */
>                       mutex_unlock(&event->mmap_mutex);
>               }
>               mutex_unlock(&ctx->mutex);
>       }
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to