Re: [PATCH] perf_event: fix loss of notification with multi-event sampling

Peter Zijlstra
2011-11-22T10:41:01Z

On Wed, 2011-11-16 at 15:53 +0100, Stephane Eranian wrote:
> + /* ring_buffer waitq pointer */
> + wait_queue_head_t *waitq;

Not a big issue, but is there a reason to keep this pointer instead of
always having to do:

rcu_read_lock();
rb = rcu_dereference(event->rb);
if (rb)
wake_up_all(rb->waitq);
rcu_read_unlock();

Hmm, looking at that there must be a reason we go through all the RCU
trouble for event->rb, assuming there is, your lack of rcu in say
perf_poll() could go funny.

/me ponders..

Ah, could it be a race of poll()/wakeup() vs perf_event_set_output() ?

Suppose you're a threaded proglet and either one cpu/thread has an
incoming event that does a wakeup, or one thread is stuck in poll()
whilst another thread does perf_event_set_output(), it could swizzle the
event->rb right out from under you.

Now, this is of course a somewhat silly thing to do.. but still it
shouldn't make things go *bang*.

Now the above wake_up_all() thing would work just fine, its just poll()
that I'm not sure how to fix.