Re: [PATCH 1/7] General notification queue with user mmap()'able ring buffer

From: Peter Zijlstra
Date: Fri May 31 2019 - 04:39:30 EST


On Thu, May 30, 2019 at 11:50:39AM +0200, Andrea Parri wrote:
> > > Looking at the perf ring buffer, there appears to be a missing barrier in
> > > perf_aux_output_end():
> > >
> > > rb->user_page->aux_head = rb->aux_head;
> > >
> > > should be:
> > >
> > > smp_store_release(&rb->user_page->aux_head, rb->aux_head);
> > >
> > > It should also be using smp_load_acquire(). See
> > > Documentation/core-api/circular-buffers.rst
> > >
> > > And a (partial) patch has been proposed: https://lkml.org/lkml/2018/5/10/249
> >
> > So, if that's all that needs to be fixed, can you use the same
> > buffer/code if that patch is merged?
>
> That's about one year old...: let me add the usual suspects in Cc: ;-)
> since I'm not sure what the plan was (or if I'm missing something) ...

The AUX crud is 'special' and smp_store_release() doesn't really help in
many cases. Notable, AUX is typically used in combination with a
hardware writer. The driver is in charge of odering here, the generic
code doesn't know what the appropriate barrier (if any) is and would
have to resort to the most expensive/heavy one available.

Also see the comment right above this function:

"It is the
pmu driver's responsibility to observe ordering rules of the hardware,
so that all the data is externally visible before this is called."