Commit 92d5a606 authored by Masami Hiramatsu (Google)'s avatar Masami Hiramatsu (Google) Committed by Steven Rostedt
Browse files

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: ca296d32 ("tracing: ring_buffer: Rewind persistent ring buffer on reboot")
Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
parent 5335e318
Loading
Loading
Loading
Loading
+7 −6
Original line number Diff line number Diff line
@@ -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);