Messages in this thread Patch in this message | | | Date | Thu, 10 Sep 2015 18:16:24 +0200 | From | Peter Zijlstra <> | Subject | [RFC][PATCH 3/3] perf: Fix races in computing the header sizes |
| |
There are two races with the current code:
- Another event can join the group and compute a larger header_size concurrently, if the smaller store wins we'll have an incorrect header_size set.
- We compute the header_size after the event becomes active, therefore its possible to use the size before its computed.
Remedy the first by moving the computation inside the ctx::mutex lock, and the second by placing it _before_ perf_install_in_context().
Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> --- kernel/events/core.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
--- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -8349,6 +8349,15 @@ SYSCALL_DEFINE5(perf_event_open, put_ctx(gctx); } + /* + * Precalculate sample_data sizes; do while holding ctx::mutex such + * that we're serialized against further additions and before + * perf_install_in_context() which is the point the event is active and + * can use these values. + */ + perf_event__header_size(event); + perf_event__id_header_size(event); + perf_install_in_context(ctx, event, event->cpu); perf_unpin_context(ctx); @@ -8365,12 +8374,6 @@ SYSCALL_DEFINE5(perf_event_open, mutex_unlock(¤t->perf_event_mutex); /* - * Precalculate sample_data sizes - */ - perf_event__header_size(event); - perf_event__id_header_size(event); - - /* * Drop the reference on the group_event after placing the * new event on the sibling_list. This ensures destruction * of the group leader will find the pointer to itself in
| |