Messages in this thread | | | Date | Thu, 3 Dec 2015 13:36:46 -0700 | Subject | Re: [PATCH 5/7] perf: Document aux api usage | From | Mathieu Poirier <> |
| |
On 3 December 2015 at 03:32, Alexander Shishkin <alexander.shishkin@linux.intel.com> wrote: > In order to ensure safe aux buffer management, we rely on the assumption > that pmu::stop() stops its ongoing aux transaction and not just the hw. > > This patch documents this requirement for perf_aux_output_{begin,end}() > apis. > > Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> > Cc: Mathieu Poirier <mathieu.poirier@linaro.org> > --- > kernel/events/ring_buffer.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c > index 6865ac95ca..1aed2617e8 100644 > --- a/kernel/events/ring_buffer.c > +++ b/kernel/events/ring_buffer.c > @@ -252,6 +252,10 @@ ring_buffer_init(struct ring_buffer *rb, long watermark, int flags) > * The ordering is similar to that of perf_output_{begin,end}, with > * the exception of (B), which should be taken care of by the pmu > * driver, since ordering rules will differ depending on hardware. > + * > + * Call this from pmu::start(); see the comment in perf_aux_output_end() > + * about its use in pmu callbacks. Both can also be called from the PMI > + * handler if needed. > */ > void *perf_aux_output_begin(struct perf_output_handle *handle, > struct perf_event *event) > @@ -323,6 +327,7 @@ void *perf_aux_output_begin(struct perf_output_handle *handle, > return handle->rb->aux_priv; > > err_put: > + /* can't be last */ > rb_free_aux(rb); > > err: > @@ -337,6 +342,10 @@ err: > * aux_head and posting a PERF_RECORD_AUX into the perf buffer. 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. > + * > + * Note: this has to be called from pmu::stop() callback, as the assumption > + * of the aux buffer management code is that after pmu::stop(), the aux > + * transaction must be stopped and therefore drop the aux reference count. > */ > void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size, > bool truncated) > @@ -376,6 +385,7 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size, > handle->event = NULL; > > local_set(&rb->aux_nest, 0); > + /* can't be last */ > rb_free_aux(rb); > ring_buffer_put(rb); > } > -- > 2.6.2 >
Thanks for the heads-up. My next version (V7) will follow the same scheme.
Mathieu
| |