Because, ring_buffer_subbuf_order_set() can clear cpu_buffer->free_page,
hold cpu_buffer->lock to prevent races with
ring_buffer_alloc_read_page() and ring_buffer_free_read_page().

Fixes: 8e7b58c27b3c ("ring-buffer: Just update the subbuffers when changing 
their allocation order")
Reported-by: Sashiko <[email protected]>
Signed-off-by: Vincent Donnefort <[email protected]>

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index a3d28b2e2c94..ec4f5a0c93e8 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -7431,8 +7431,10 @@ int ring_buffer_subbuf_order_set(struct trace_buffer 
*buffer, int order)
                cpu_buffer->nr_pages = cpu_buffer->nr_pages_to_update;
                cpu_buffer->nr_pages_to_update = 0;
 
+               arch_spin_lock(&cpu_buffer->lock);
                old_free_data_page = cpu_buffer->free_page;
                cpu_buffer->free_page = NULL;
+               arch_spin_unlock(&cpu_buffer->lock);
 
                rb_head_page_activate(cpu_buffer);
 
-- 
2.55.0.691.gc56d675ccc-goog


Reply via email to