Messages in this thread | | | Date | Fri, 4 Dec 2015 23:17:23 +0100 | From | Peter Zijlstra <> | Subject | Re: [PATCH 4/7] perf: Free aux pages in unmap path |
| |
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); > } > >
| |