| From b81f472a208d3e2b4392faa6d17037a89442f4ce Mon Sep 17 00:00:00 2001 |
| From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org> |
| Date: Mon, 23 Nov 2015 10:35:36 -0500 |
| Subject: ring-buffer: Update read stamp with first real commit on page |
| |
| commit b81f472a208d3e2b4392faa6d17037a89442f4ce upstream. |
| |
| Do not update the read stamp after swapping out the reader page from the |
| write buffer. If the reader page is swapped out of the buffer before an |
| event is written to it, then the read_stamp may get an out of date |
| timestamp, as the page timestamp is updated on the first commit to that |
| page. |
| |
| rb_get_reader_page() only returns a page if it has an event on it, otherwise |
| it will return NULL. At that point, check if the page being returned has |
| events and has not been read yet. Then at that point update the read_stamp |
| to match the time stamp of the reader page. |
| |
| Signed-off-by: Steven Rostedt <rostedt@goodmis.org> |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| kernel/trace/ring_buffer.c | 12 +++++------- |
| 1 file changed, 5 insertions(+), 7 deletions(-) |
| |
| --- a/kernel/trace/ring_buffer.c |
| +++ b/kernel/trace/ring_buffer.c |
| @@ -1549,12 +1549,6 @@ rb_set_commit_to_write(struct ring_buffe |
| goto again; |
| } |
| |
| -static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer) |
| -{ |
| - cpu_buffer->read_stamp = cpu_buffer->reader_page->page->time_stamp; |
| - cpu_buffer->reader_page->read = 0; |
| -} |
| - |
| static void rb_inc_iter(struct ring_buffer_iter *iter) |
| { |
| struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; |
| @@ -3094,7 +3088,7 @@ rb_get_reader_page(struct ring_buffer_pe |
| |
| /* Finally update the reader page to the new head */ |
| cpu_buffer->reader_page = reader; |
| - rb_reset_reader_page(cpu_buffer); |
| + cpu_buffer->reader_page->read = 0; |
| |
| if (overwrite != cpu_buffer->last_overrun) { |
| cpu_buffer->lost_events = overwrite - cpu_buffer->last_overrun; |
| @@ -3104,6 +3098,10 @@ rb_get_reader_page(struct ring_buffer_pe |
| goto again; |
| |
| out: |
| + /* Update the read_stamp on the first event */ |
| + if (reader && reader->read == 0) |
| + cpu_buffer->read_stamp = reader->page->time_stamp; |
| + |
| arch_spin_unlock(&cpu_buffer->lock); |
| local_irq_restore(flags); |
| |