perf/ring_buffer: Document AUX API usage
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 the perf_aux_output_{begin,end}() APIs. Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mathieu Poirier <mathieu.poirier@linaro.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Cc: vince@deater.net Link: http://lkml.kernel.org/r/1457098969-21595-4-git-send-email-alexander.shishkin@linux.intel.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
95ff4ca26c
commit
af5bb4ed12
|
@ -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 ordering is similar to that of perf_output_{begin,end}, with
|
||||||
* the exception of (B), which should be taken care of by the pmu
|
* the exception of (B), which should be taken care of by the pmu
|
||||||
* driver, since ordering rules will differ depending on hardware.
|
* 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,
|
void *perf_aux_output_begin(struct perf_output_handle *handle,
|
||||||
struct perf_event *event)
|
struct perf_event *event)
|
||||||
|
@ -323,6 +327,7 @@ void *perf_aux_output_begin(struct perf_output_handle *handle,
|
||||||
return handle->rb->aux_priv;
|
return handle->rb->aux_priv;
|
||||||
|
|
||||||
err_put:
|
err_put:
|
||||||
|
/* can't be last */
|
||||||
rb_free_aux(rb);
|
rb_free_aux(rb);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
|
@ -337,6 +342,10 @@ err:
|
||||||
* aux_head and posting a PERF_RECORD_AUX into the perf buffer. It is the
|
* 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,
|
* pmu driver's responsibility to observe ordering rules of the hardware,
|
||||||
* so that all the data is externally visible before this is called.
|
* 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,
|
void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size,
|
||||||
bool truncated)
|
bool truncated)
|
||||||
|
@ -376,6 +385,7 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size,
|
||||||
handle->event = NULL;
|
handle->event = NULL;
|
||||||
|
|
||||||
local_set(&rb->aux_nest, 0);
|
local_set(&rb->aux_nest, 0);
|
||||||
|
/* can't be last */
|
||||||
rb_free_aux(rb);
|
rb_free_aux(rb);
|
||||||
ring_buffer_put(rb);
|
ring_buffer_put(rb);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue