From: Masami Hiramatsu (Google) <mhiramat@kernel.org>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org
Subject: Re: [PATCH v3 1/2] tracing: ring_buffer: Rewind persistent ring buffer when reboot
Date: Wed, 4 Jun 2025 06:58:14 +0900 [thread overview]
Message-ID: <20250604065814.a9df1d1944390d4c262852bd@kernel.org> (raw)
In-Reply-To: <20250603120049.692d48b4@gandalf.local.home>
On Tue, 3 Jun 2025 12:00:49 -0400
Steven Rostedt <rostedt@goodmis.org> wrote:
> On Fri, 23 May 2025 00:54:44 +0900
> "Masami Hiramatsu (Google)" <mhiramat@kernel.org> wrote:
>
> > @@ -6642,7 +6739,6 @@ int ring_buffer_read_page(struct trace_buffer *buffer,
> > cpu_buffer->read_bytes += rb_page_size(reader);
> >
> > /* swap the pages */
> > - rb_init_page(bpage);
> > bpage = reader->page;
> > reader->page = data_page->data;
> > local_set(&reader->write, 0);
>
> Here's the bug we were looking for. We definitely need to keep the
> rb_init_page() here!
Ah, thanks for finding the bug!
>
> That's because this is the } else { part of the if condition that on true
> will do a copy and not a swap of the reader page.
>
> ring_buffer_read_page() has:
>
> if (read || (len < (commit - read)) ||
> cpu_buffer->reader_page == cpu_buffer->commit_page ||
> cpu_buffer->mapped) {
>
> // Copy the buffer to the passed in data_page
>
> } else {
>
> // swap the data_page with the reader page
>
> }
>
> The else part is here, and it's swapping the passed in data_page with the
> current reader_page. We have to initialize the data_page here.
Oops, I confused the "swap" meant reader <-> head, but that should be
done in rb_get_reader_page(), not here.
>
> What we see happening is:
>
> info->spare = ring_buffer_alloc_read_page(); <-- this is the data_page
>
> [..]
>
> ret = ring_buffer_read_page(..., info->spare, ...);
>
> Since this is a normal buffer, we swap the reader_page with info->spare,
> where info->spare now has the reader_page.
>
> It consumes the data via:
>
> trace_data = ring_buffer_read_data(info->spare);
>
> Then reads the buffer again:
>
> ret = ring_buffer_read_page(..., info->spare, ...);
>
> Now it hits the if statement again:
>
> if (read || (len < (commit - read)) ||
> cpu_buffer->reader_page == cpu_buffer->commit_page ||
> cpu_buffer->mapped) {
>
> // Copy the buffer to the passed in data_page
So all mapped buffers (including persistent ring buffer) pass
this block.
>
> } else {
>
> // swap the data_page with the reader page
>
> ---->> here it just swaps the last data_page with the current one.
So the data_page should not have any data. its commit should be 0.
>
> }
>
>
> As we never clear the "commit" part of the page, it still thinks it has
> content on the page as the "read" was set to zero, and it reads the old
> content again.
Got it.
>
> There's no reason not to clear the "commit" of the data_page passed in. It
> is not old data that is about to be lost. We most definitely need to call
> rb_init_page() on it.
Yeah, that data should be considered as cleared.
>
> After adding that back, trace-cmd record works properly again.
>
> Care to send a v4 without removing this rb_init_page(bpage); ?
OK, let me remove that (also remove timestamp check).
Thank you!
>
> -- Steve
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
next prev parent reply other threads:[~2025-06-03 21:58 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-22 15:54 [PATCH v3 0/2] tracing: Rewind persistent ring buffer Masami Hiramatsu (Google)
2025-05-22 15:54 ` [PATCH v3 1/2] tracing: ring_buffer: Rewind persistent ring buffer when reboot Masami Hiramatsu (Google)
2025-05-23 20:54 ` Steven Rostedt
2025-05-23 21:28 ` Steven Rostedt
2025-05-26 3:03 ` Masami Hiramatsu
2025-05-27 0:17 ` Masami Hiramatsu
2025-05-27 3:15 ` Masami Hiramatsu
2025-05-27 3:54 ` Masami Hiramatsu
2025-05-27 13:47 ` Steven Rostedt
2025-05-28 0:22 ` Masami Hiramatsu
2025-05-23 23:20 ` Steven Rostedt
2025-05-26 3:44 ` Masami Hiramatsu
2025-05-27 13:48 ` Steven Rostedt
2025-06-03 16:00 ` Steven Rostedt
2025-06-03 21:58 ` Masami Hiramatsu [this message]
2025-05-22 15:54 ` [PATCH v3 2/2] tracing: Reset last-boot buffers when reading out all cpu buffers Masami Hiramatsu (Google)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250604065814.a9df1d1944390d4c262852bd@kernel.org \
--to=mhiramat@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=rostedt@goodmis.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®