mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
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:
parent
20d432b445
commit
9fd830120f
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user