Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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: 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>

authored by

Masami Hiramatsu (Google) and committed by
Steven Rostedt
92d5a606 5335e318

+7 -6
+7 -6
kernel/trace/ring_buffer.c
··· 1884 1884 static void rb_meta_validate_events(struct ring_buffer_per_cpu *cpu_buffer) 1885 1885 { 1886 1886 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; 1888 1888 unsigned long entry_bytes = 0; 1889 1889 unsigned long entries = 0; 1890 1890 int ret; ··· 1895 1895 return; 1896 1896 1897 1897 orig_head = head_page = cpu_buffer->head_page; 1898 + orig_reader = cpu_buffer->reader_page; 1898 1899 1899 1900 /* 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); 1901 1902 if (ret < 0) { 1902 1903 pr_info("Ring buffer reader page is invalid\n"); 1903 1904 goto invalid; 1904 1905 } 1905 1906 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); 1908 1909 1909 1910 ts = head_page->page->time_stamp; 1910 1911 ··· 2008 2007 /* Iterate until finding the commit page */ 2009 2008 for (i = 0; i < meta->nr_subbufs + 1; i++, rb_inc_page(&head_page)) { 2010 2009 2011 - /* Reader page has already been done */ 2012 - if (head_page == cpu_buffer->reader_page) 2010 + /* The original reader page has already been checked/counted. */ 2011 + if (head_page == orig_reader) 2013 2012 continue; 2014 2013 2015 2014 ret = rb_validate_buffer(head_page->page, cpu_buffer->cpu);