ring-buffer: Clean up resize_disabled checks

ring_buffer_subbuf_order_set() checks for resize_disabled twice under
the same buffer->mutex hold. Moreover, this check duplicates the logic
in ring_buffer_resize(). Create a common helper rb_resize_disabled() to
factor out this code.

Link: https://patch.msgid.link/20260916152813.105082-2-vdonnefort@google.com
Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
Vincent Donnefort 2026-09-16 16:28:12 +01:00 committed by Steven Rostedt
parent 20d432b445
commit 9fd830120f

View File

@ -3282,6 +3282,21 @@ static void update_pages_handler(struct work_struct *work)
complete(&cpu_buffer->update_done);
}
static bool rb_resize_disabled(struct trace_buffer *buffer, int cpu)
{
lockdep_assert_held(&buffer->mutex);
if (cpu != RING_BUFFER_ALL_CPUS)
return atomic_read(&buffer->buffers[cpu]->resize_disabled);
for_each_buffer_cpu(buffer, cpu) {
if (atomic_read(&buffer->buffers[cpu]->resize_disabled))
return true;
}
return false;
}
/**
* ring_buffer_resize - resize the ring buffer
* @buffer: the buffer to resize.
@ -3322,20 +3337,17 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
nr_pages = rb_calculate_nr_pages(buffer, size);
if (cpu_id == RING_BUFFER_ALL_CPUS) {
/*
* Don't succeed if resizing is disabled, as a reader might be
* manipulating the ring buffer and is expecting a sane state while
* this is true.
*/
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
if (atomic_read(&cpu_buffer->resize_disabled)) {
err = -EBUSY;
goto out_err_unlock;
}
}
/*
* Don't succeed if resizing is disabled, as a reader might be
* manipulating the ring buffer and is expecting a sane state while
* this is true.
*/
if (rb_resize_disabled(buffer, cpu_id)) {
err = -EBUSY;
goto out_err_unlock;
}
if (cpu_id == RING_BUFFER_ALL_CPUS) {
/* calculate the pages to update */
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
@ -3407,16 +3419,6 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
if (nr_pages == cpu_buffer->nr_pages)
goto out;
/*
* Don't succeed if resizing is disabled, as a reader might be
* manipulating the ring buffer and is expecting a sane state while
* this is true.
*/
if (atomic_read(&cpu_buffer->resize_disabled)) {
err = -EBUSY;
goto out_err_unlock;
}
cpu_buffer->nr_pages_to_update = nr_pages -
cpu_buffer->nr_pages;
@ -7471,13 +7473,9 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
old_capacity = rb_subbuf_capacity(buffer);
/* The mmap fast path reads subbuf_order without buffer->mutex. */
for_each_buffer_cpu(buffer, cpu) {
if (!cpumask_test_cpu(cpu, buffer->cpumask))
continue;
if (atomic_read(&buffer->buffers[cpu]->resize_disabled))
return -EBUSY;
}
/* Check it is resizable before we touch subbuf_order */
if (rb_resize_disabled(buffer, RING_BUFFER_ALL_CPUS))
return -EBUSY;
atomic_inc(&buffer->record_disabled);
@ -7494,11 +7492,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
cpu_buffer = buffer->buffers[cpu];
if (atomic_read(&cpu_buffer->resize_disabled)) {
err = -EBUSY;
goto error;
}
/* Update the number of pages to match the new size */
nr_pages = rb_calculate_nr_pages(buffer,
old_capacity * buffer->buffers[cpu]->nr_pages);