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.

Merge tag 'trace-ring-buffer-v7.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace

Pull ring-buffer fix from Steven Rostedt:

- Fix accounting of persistent ring buffer rewind

On boot up, the head page is moved back to the earliest point of the
saved ring buffer. This is because the ring buffer being read by user
space on a crash may not save the part it read. Rewinding the head
page back to the earliest saved position helps keep those events from
being lost.

The number of events is also read during boot up and displayed in the
stats file in the tracefs directory. It's also used for other
accounting as well. On boot up, the "reader page" is accounted for
but a rewind may put it back into the buffer and then the reader page
may be accounted for again.

Save off the original reader page and skip accounting it when
scanning the pages in the ring buffer.

* tag 'trace-ring-buffer-v7.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
ring-buffer: Do not double count the reader_page

+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);