summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2025-02-14 12:35:12 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-02-21 14:11:00 +0100
commit238b3019dd6dd9420d61065a21e1e26b39216ef1 (patch)
tree1c9fac6916ae831b96689109f4bc17612a3702bc
parent0d547a6f5e8fad26ebc12f501d7d19fccdbad6bf (diff)
downloadlinux-238b3019dd6dd9420d61065a21e1e26b39216ef1.tar.gz
linux-238b3019dd6dd9420d61065a21e1e26b39216ef1.tar.bz2
linux-238b3019dd6dd9420d61065a21e1e26b39216ef1.zip
ring-buffer: Update pages_touched to reflect persistent buffer content
commit 97937834ae876f29565415ab15f1284666dc6be3 upstream. The pages_touched field represents the number of subbuffers in the ring buffer that have content that can be read. This is used in accounting of "dirty_pages" and "buffer_percent" to allow the user to wait for the buffer to be filled to a certain amount before it reads the buffer in blocking mode. The persistent buffer never updated this value so it was set to zero, and this accounting would take it as it had no content. This would cause user space to wait for content even though there's enough content in the ring buffer that satisfies the buffer_percent. Cc: stable@vger.kernel.org Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Vincent Donnefort <vdonnefort@google.com> Link: https://lore.kernel.org/20250214123512.0631436e@gandalf.local.home Fixes: 5f3b6e839f3ce ("ring-buffer: Validate boot range memory events") Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--kernel/trace/ring_buffer.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 61e5a937c06c..2bbc96568a2b 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -1850,6 +1850,11 @@ static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
cpu_buffer->cpu);
goto invalid;
}
+
+ /* If the buffer has content, update pages_touched */
+ if (ret)
+ local_inc(&cpu_buffer->pages_touched);
+
entries += ret;
entry_bytes += local_read(&head_page->page->commit);
local_set(&cpu_buffer->head_page->entries, ret);