[ Upstream commit 4d839dd9e4356bbacf3eb0ab13a549b83b008c21 ]

We must use {READ,WRITE}_ONCE() on rb->user_page data such that
concurrent usage will see whole values. A few key sites were missing
this.

Suggested-by: Yabin Cui <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Vince Weaver <[email protected]>
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
Fixes: 7b732a750477 ("perf_counter: new output ABI - part 1")
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---
 kernel/events/ring_buffer.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index d32b9375ec0e..12f351b253bb 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -101,7 +101,7 @@ static void perf_output_put_handle(struct 
perf_output_handle *handle)
         * See perf_output_begin().
         */
        smp_wmb(); /* B, matches C */
-       rb->user_page->data_head = head;
+       WRITE_ONCE(rb->user_page->data_head, head);
 
        /*
         * We must publish the head before decrementing the nest count,
@@ -490,7 +490,7 @@ void perf_aux_output_end(struct perf_output_handle *handle, 
unsigned long size)
                                     handle->aux_flags);
        }
 
-       rb->user_page->aux_head = rb->aux_head;
+       WRITE_ONCE(rb->user_page->aux_head, rb->aux_head);
        if (rb_need_aux_wakeup(rb))
                wakeup = true;
 
@@ -522,7 +522,7 @@ int perf_aux_output_skip(struct perf_output_handle *handle, 
unsigned long size)
 
        rb->aux_head += size;
 
-       rb->user_page->aux_head = rb->aux_head;
+       WRITE_ONCE(rb->user_page->aux_head, rb->aux_head);
        if (rb_need_aux_wakeup(rb)) {
                perf_output_wakeup(handle);
                handle->wakeup = rb->aux_wakeup + rb->aux_watermark;
-- 
2.20.1



Reply via email to