mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 03:11:11 -04:00
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: ca296d32ec ("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>
This commit is contained in:
committed by
Steven Rostedt
parent
5335e318ad
commit
92d5a60672
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user