]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ring-buffer: Do not double count the reader_page
authorMasami Hiramatsu (Google) <mhiramat@kernel.org>
Fri, 24 Apr 2026 06:52:10 +0000 (15:52 +0900)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 24 Apr 2026 19:34:39 +0000 (15:34 -0400)
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>
kernel/trace/ring_buffer.c

index cef49f8871d2ec546e8d481a655d09cd256a07c4..5326924615a4e0acf2eefb08326e91e08073e807 100644 (file)
@@ -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);