Skip to content

Commit 27d128c

Browse files
committed
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
2 parents f3e3dbc + 92d5a60 commit 27d128c

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)