Skip to content

Commit 92d5a60

Browse files
mhiramatrostedt
authored andcommitted
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: ca296d3 ("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>
1 parent 5335e31 commit 92d5a60

1 file changed

Lines changed: 7 additions & 6 deletions

File tree

kernel/trace/ring_buffer.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,7 +1884,7 @@ static int rb_validate_buffer(struct buffer_data_page *dpage, int cpu)
18841884
static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
18851885
{
18861886
struct ring_buffer_cpu_meta *meta = cpu_buffer->ring_meta;
1887-
struct buffer_page *head_page, *orig_head;
1887+
struct buffer_page *head_page, *orig_head, *orig_reader;
18881888
unsigned long entry_bytes = 0;
18891889
unsigned long entries = 0;
18901890
int ret;
@@ -1895,16 +1895,17 @@ static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
18951895
return;
18961896

18971897
orig_head = head_page = cpu_buffer->head_page;
1898+
orig_reader = cpu_buffer->reader_page;
18981899

18991900
/* Do the reader page first */
1900-
ret = rb_validate_buffer(cpu_buffer->reader_page->page, cpu_buffer->cpu);
1901+
ret = rb_validate_buffer(orig_reader->page, cpu_buffer->cpu);
19011902
if (ret < 0) {
19021903
pr_info("Ring buffer reader page is invalid\n");
19031904
goto invalid;
19041905
}
19051906
entries += ret;
1906-
entry_bytes += local_read(&cpu_buffer->reader_page->page->commit);
1907-
local_set(&cpu_buffer->reader_page->entries, ret);
1907+
entry_bytes += local_read(&orig_reader->page->commit);
1908+
local_set(&orig_reader->entries, ret);
19081909

19091910
ts = head_page->page->time_stamp;
19101911

@@ -2007,8 +2008,8 @@ static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer)
20072008
/* Iterate until finding the commit page */
20082009
for (i = 0; i < meta->nr_subbufs + 1; i++, rb_inc_page(&head_page)) {
20092010

2010-
/* Reader page has already been done */
2011-
if (head_page == cpu_buffer->reader_page)
2011+
/* The original reader page has already been checked/counted. */
2012+
if (head_page == orig_reader)
20122013
continue;
20132014

20142015
ret = rb_validate_buffer(head_page->page, cpu_buffer->cpu);

0 commit comments

Comments
 (0)