* [PATCH] ring-buffer: fix error handling in ring_buffer_subbuf_order_set()
@ 2025-06-06 9:12 Dmitry Antipov
2025-06-06 10:51 ` Steven Rostedt
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Antipov @ 2025-06-06 9:12 UTC (permalink / raw)
To: Tzvetomir Stoyanov
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
linux-trace-kernel, Dmitry Antipov, syzbot+05d673e83ec640f0ced9
In 'ring_buffer_subbuf_order_set()', enlarge critical section to
ensure that error handling takes place with per-buffer mutex hold,
thus preventing list corruption and other concurrency-related issues.
Reported-by: syzbot+05d673e83ec640f0ced9@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=05d673e83ec640f0ced9
Fixes: f9b94daa542a8 ("ring-buffer: Set new size of the ring buffer sub page")
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
---
kernel/trace/ring_buffer.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index e24509bd0af5..2028a24d6418 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -6908,9 +6908,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
buffer->subbuf_order = old_order;
buffer->subbuf_size = old_size;
- atomic_dec(&buffer->record_disabled);
- mutex_unlock(&buffer->mutex);
-
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
@@ -6923,6 +6920,9 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
}
}
+ atomic_dec(&buffer->record_disabled);
+ mutex_unlock(&buffer->mutex);
+
return err;
}
EXPORT_SYMBOL_GPL(ring_buffer_subbuf_order_set);
--
2.49.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] ring-buffer: fix error handling in ring_buffer_subbuf_order_set()
2025-06-06 9:12 [PATCH] ring-buffer: fix error handling in ring_buffer_subbuf_order_set() Dmitry Antipov
@ 2025-06-06 10:51 ` Steven Rostedt
2025-06-06 11:22 ` [PATCH v2] ring-buffer: fix buffer locking " Dmitry Antipov
0 siblings, 1 reply; 4+ messages in thread
From: Steven Rostedt @ 2025-06-06 10:51 UTC (permalink / raw)
To: Dmitry Antipov
Cc: Tzvetomir Stoyanov, Masami Hiramatsu, Mathieu Desnoyers,
linux-trace-kernel, syzbot+05d673e83ec640f0ced9
On Fri, 6 Jun 2025 12:12:17 +0300
Dmitry Antipov <dmantipov@yandex.ru> wrote:
> In 'ring_buffer_subbuf_order_set()', enlarge critical section to
> ensure that error handling takes place with per-buffer mutex hold,
> thus preventing list corruption and other concurrency-related issues.
>
> Reported-by: syzbot+05d673e83ec640f0ced9@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=05d673e83ec640f0ced9
> Fixes: f9b94daa542a8 ("ring-buffer: Set new size of the ring buffer sub page")
> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
> ---
> kernel/trace/ring_buffer.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
> index e24509bd0af5..2028a24d6418 100644
> --- a/kernel/trace/ring_buffer.c
> +++ b/kernel/trace/ring_buffer.c
> @@ -6908,9 +6908,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
> buffer->subbuf_order = old_order;
> buffer->subbuf_size = old_size;
>
> - atomic_dec(&buffer->record_disabled);
There's no reason to move the record_disable. Enabling recording here is
fine, as the pages being freed have not been added to the ring buffer.
> - mutex_unlock(&buffer->mutex);
> -
> for_each_buffer_cpu(buffer, cpu) {
> cpu_buffer = buffer->buffers[cpu];
>
> @@ -6923,6 +6920,9 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
> }
> }
>
> + atomic_dec(&buffer->record_disabled);
> + mutex_unlock(&buffer->mutex);
As this moves the mutex to the end, we can instead just remove the
mutex_unlock()s and replace the mutex() with:
guard(mutex)(&buffer->mutex);
Care to send a v2?
-- Steve
> +
> return err;
> }
> EXPORT_SYMBOL_GPL(ring_buffer_subbuf_order_set);
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2] ring-buffer: fix buffer locking in ring_buffer_subbuf_order_set()
2025-06-06 10:51 ` Steven Rostedt
@ 2025-06-06 11:22 ` Dmitry Antipov
2025-06-09 6:25 ` Masami Hiramatsu
0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Antipov @ 2025-06-06 11:22 UTC (permalink / raw)
To: Steven Rostedt
Cc: Masami Hiramatsu, Mathieu Desnoyers, Tzvetomir Stoyanov,
linux-trace-kernel, Dmitry Antipov, syzbot+05d673e83ec640f0ced9
In 'ring_buffer_subbuf_order_set()', prefer mutex guard over explicit
mutex operations to ensure that the buffer remains locked everywhere
where its innards may be changed, thus preventing per-CPU sub-buffer
lists corruptions and other concurrency-related issues.
Reported-by: syzbot+05d673e83ec640f0ced9@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=05d673e83ec640f0ced9
Fixes: f9b94daa542a8 ("ring-buffer: Set new size of the ring buffer sub page")
Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
---
v2: use mutex guard as suggested by Steven
---
kernel/trace/ring_buffer.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index e24509bd0af5..00fc38d70e86 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -6795,7 +6795,7 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
old_size = buffer->subbuf_size;
/* prevent another thread from changing buffer sizes */
- mutex_lock(&buffer->mutex);
+ guard(mutex)(&buffer->mutex);
atomic_inc(&buffer->record_disabled);
/* Make sure all commits have finished */
@@ -6900,7 +6900,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
}
atomic_dec(&buffer->record_disabled);
- mutex_unlock(&buffer->mutex);
return 0;
@@ -6909,7 +6908,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
buffer->subbuf_size = old_size;
atomic_dec(&buffer->record_disabled);
- mutex_unlock(&buffer->mutex);
for_each_buffer_cpu(buffer, cpu) {
cpu_buffer = buffer->buffers[cpu];
--
2.49.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] ring-buffer: fix buffer locking in ring_buffer_subbuf_order_set()
2025-06-06 11:22 ` [PATCH v2] ring-buffer: fix buffer locking " Dmitry Antipov
@ 2025-06-09 6:25 ` Masami Hiramatsu
0 siblings, 0 replies; 4+ messages in thread
From: Masami Hiramatsu @ 2025-06-09 6:25 UTC (permalink / raw)
To: Dmitry Antipov
Cc: Steven Rostedt, Masami Hiramatsu, Mathieu Desnoyers,
Tzvetomir Stoyanov, linux-trace-kernel,
syzbot+05d673e83ec640f0ced9
On Fri, 6 Jun 2025 14:22:42 +0300
Dmitry Antipov <dmantipov@yandex.ru> wrote:
> In 'ring_buffer_subbuf_order_set()', prefer mutex guard over explicit
> mutex operations to ensure that the buffer remains locked everywhere
> where its innards may be changed, thus preventing per-CPU sub-buffer
> lists corruptions and other concurrency-related issues.
>
> Reported-by: syzbot+05d673e83ec640f0ced9@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=05d673e83ec640f0ced9
> Fixes: f9b94daa542a8 ("ring-buffer: Set new size of the ring buffer sub page")
> Signed-off-by: Dmitry Antipov <dmantipov@yandex.ru>
Looks good to me.
Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Thanks,
> ---
> v2: use mutex guard as suggested by Steven
> ---
> kernel/trace/ring_buffer.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
> index e24509bd0af5..00fc38d70e86 100644
> --- a/kernel/trace/ring_buffer.c
> +++ b/kernel/trace/ring_buffer.c
> @@ -6795,7 +6795,7 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
> old_size = buffer->subbuf_size;
>
> /* prevent another thread from changing buffer sizes */
> - mutex_lock(&buffer->mutex);
> + guard(mutex)(&buffer->mutex);
> atomic_inc(&buffer->record_disabled);
>
> /* Make sure all commits have finished */
> @@ -6900,7 +6900,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
> }
>
> atomic_dec(&buffer->record_disabled);
> - mutex_unlock(&buffer->mutex);
>
> return 0;
>
> @@ -6909,7 +6908,6 @@ int ring_buffer_subbuf_order_set(struct trace_buffer *buffer, int order)
> buffer->subbuf_size = old_size;
>
> atomic_dec(&buffer->record_disabled);
> - mutex_unlock(&buffer->mutex);
>
> for_each_buffer_cpu(buffer, cpu) {
> cpu_buffer = buffer->buffers[cpu];
> --
> 2.49.0
>
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-06-09 6:25 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-06 9:12 [PATCH] ring-buffer: fix error handling in ring_buffer_subbuf_order_set() Dmitry Antipov
2025-06-06 10:51 ` Steven Rostedt
2025-06-06 11:22 ` [PATCH v2] ring-buffer: fix buffer locking " Dmitry Antipov
2025-06-09 6:25 ` Masami Hiramatsu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).