From: Masami Hiramatsu (Google) <[email protected]>

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.

Fixes: ca296d32ece3 ("tracing: ring_buffer: Rewind persistent ring buffer on 
reboot")
Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
---
 Changes in v18:
  - Newly added.
---
 kernel/trace/ring_buffer.c |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index cef49f8871d2..5326924615a4 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -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);


Reply via email to