[GIT PULL] ring-buffer: Fix for 7.1

Steven Rostedt posted 1 patch 1 month, 3 weeks ago
kernel/trace/ring_buffer.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
[GIT PULL] ring-buffer: Fix for 7.1
Posted by Steven Rostedt 1 month, 3 weeks ago

Linus,

ring-buffer fix for 7.1:

- Fix accounting of persistent ring buffer rewind

  On boot up, the head page is moved back to the earliest point of
  the saved ring buffer. This is because the ring buffer being read by
  user space on a crash may not save the part it read. Rewinding the head
  page back to the earliest saved position helps keep those events from
  being lost.

  The number of events is also read during boot up and displayed in the
  stats file in the tracefs directory. It's also used for other accounting
  as well. On boot up, the "reader page" is accounted for but a rewind may
  put it back into the buffer and then the reader page may be accounted
  for again.

  Save off the original reader page and skip accounting it when scanning
  the pages in the ring buffer.


Please pull the latest trace-ring-buffer-v7.1-3 tree, which can be found at:


  git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
trace-ring-buffer-v7.1-3

Tag SHA1: dce7a5a900b30a256337c89f337a94e5783b7b11
Head SHA1: 92d5a606721f759ebebf448b3bd2b7a781d50bd0


Masami Hiramatsu (Google) (1):
      ring-buffer: Do not double count the reader_page

----
 kernel/trace/ring_buffer.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
---------------------------
commit 92d5a606721f759ebebf448b3bd2b7a781d50bd0
Author: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Date:   Fri Apr 24 15:52:10 2026 +0900

    ring-buffer: Do not double count the reader_page
    
    Since the cpu_buffer->reader_page is updated if there are unwound
    pages. After that update, we should skip the page if it is the
    original reader_page, because the original reader_page is already
    checked.
    
    Cc: stable@vger.kernel.org
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Ian Rogers <irogers@google.com>
    Link: https://patch.msgid.link/177701353063.2223789.1471163147644103306.stgit@mhiramat.tok.corp.google.com
    Fixes: ca296d32ece3 ("tracing: ring_buffer: Rewind persistent ring buffer on reboot")
    Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index cef49f8871d2..5326924615a4 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -1884,7 +1884,7 @@ static int rb_validate_buffer(struct buffer_data_page *dpage, int cpu)
 static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
 {
 	struct ring_buffer_cpu_meta *meta = cpu_buffer->ring_meta;
-	struct buffer_page *head_page, *orig_head;
+	struct buffer_page *head_page, *orig_head, *orig_reader;
 	unsigned long entry_bytes = 0;
 	unsigned long entries = 0;
 	int ret;
@@ -1895,16 +1895,17 @@ static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
 		return;
 
 	orig_head = head_page = cpu_buffer->head_page;
+	orig_reader = cpu_buffer->reader_page;
 
 	/* Do the reader page first */
-	ret = rb_validate_buffer(cpu_buffer->reader_page->page, cpu_buffer->cpu);
+	ret = rb_validate_buffer(orig_reader->page, cpu_buffer->cpu);
 	if (ret < 0) {
 		pr_info("Ring buffer reader page is invalid\n");
 		goto invalid;
 	}
 	entries += ret;
-	entry_bytes += local_read(&cpu_buffer->reader_page->page->commit);
-	local_set(&cpu_buffer->reader_page->entries, ret);
+	entry_bytes += local_read(&orig_reader->page->commit);
+	local_set(&orig_reader->entries, ret);
 
 	ts = head_page->page->time_stamp;
 
@@ -2007,8 +2008,8 @@ static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
 	/* Iterate until finding the commit page */
 	for (i = 0; i < meta->nr_subbufs + 1; i++, rb_inc_page(&head_page)) {
 
-		/* Reader page has already been done */
-		if (head_page == cpu_buffer->reader_page)
+		/* The original reader page has already been checked/counted. */
+		if (head_page == orig_reader)
 			continue;
 
 		ret = rb_validate_buffer(head_page->page, cpu_buffer->cpu);
Re: [GIT PULL] ring-buffer: Fix for 7.1
Posted by pr-tracker-bot@kernel.org 1 month, 3 weeks ago
The pull request you sent on Fri, 24 Apr 2026 16:23:30 -0400:

> git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git trace-ring-buffer-v7.1-3

has been merged into torvalds/linux.git:
https://git.kernel.org/torvalds/c/27d128c1cff64c3b8012cc56dd5a1391bb4f1821

Thank you!

-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/prtracker.html