Skip to content

Commit b049525

Browse files
committed
ring-buffer: Have saved event hold the entire event
For the ring buffer iterator (non-consuming read), the event needs to be copied into the iterator buffer to make sure that a writer does not overwrite it while the user is reading it. If a write happens during the copy, the buffer is simply discarded. But the temp buffer itself was not big enough. The allocation of the buffer was only BUF_MAX_DATA_SIZE, which is the maximum data size that can be passed into the ring buffer and saved. But the temp buffer needs to hold the meta data as well. That would be BUF_PAGE_SIZE and not BUF_MAX_DATA_SIZE. Link: https://lore.kernel.org/linux-trace-kernel/[email protected] Cc: [email protected] Cc: Masami Hiramatsu <[email protected]> Cc: Mark Rutland <[email protected]> Cc: Mathieu Desnoyers <[email protected]> Fixes: 785888c ("ring-buffer: Have rb_iter_head_event() handle concurrent writer") Signed-off-by: Steven Rostedt (Google) <[email protected]>
1 parent 9e45e39 commit b049525

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

kernel/trace/ring_buffer.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,7 +2409,7 @@ rb_iter_head_event(struct ring_buffer_iter *iter)
24092409
*/
24102410
barrier();
24112411

2412-
if ((iter->head + length) > commit || length > BUF_MAX_DATA_SIZE)
2412+
if ((iter->head + length) > commit || length > BUF_PAGE_SIZE)
24132413
/* Writer corrupted the read? */
24142414
goto reset;
24152415

@@ -5118,7 +5118,8 @@ ring_buffer_read_prepare(struct trace_buffer *buffer, int cpu, gfp_t flags)
51185118
if (!iter)
51195119
return NULL;
51205120

5121-
iter->event = kmalloc(BUF_MAX_DATA_SIZE, flags);
5121+
/* Holds the entire event: data and meta data */
5122+
iter->event = kmalloc(BUF_PAGE_SIZE, flags);
51225123
if (!iter->event) {
51235124
kfree(iter);
51245125
return NULL;

0 commit comments

Comments
 (0)