aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2015-11-23 10:35:36 -0500
committerSteven Rostedt <rostedt@goodmis.org>2015-11-24 09:23:17 -0500
commitb81f472a208d3e2b4392faa6d17037a89442f4ce (patch)
tree475084e920b2cd8f45cccc45dfa7994b742113d1
parent1ec218373b8ebda821aec00bb156a9c94fad9cd4 (diff)
ring-buffer: Update read stamp with first real commit on page
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. Cc: stable@vger.kernel.org # 2.6.30+ Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--kernel/trace/ring_buffer.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 75f1d05ea82d..4dd6d5bc4e11 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -1887,12 +1887,6 @@ rb_event_index(struct ring_buffer_event *event)
1887 return (addr & ~PAGE_MASK) - BUF_PAGE_HDR_SIZE; 1887 return (addr & ~PAGE_MASK) - BUF_PAGE_HDR_SIZE;
1888} 1888}
1889 1889
1890static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
1891{
1892 cpu_buffer->read_stamp = cpu_buffer->reader_page->page->time_stamp;
1893 cpu_buffer->reader_page->read = 0;
1894}
1895
1896static void rb_inc_iter(struct ring_buffer_iter *iter) 1890static void rb_inc_iter(struct ring_buffer_iter *iter)
1897{ 1891{
1898 struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer; 1892 struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
@@ -3626,7 +3620,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
3626 3620
3627 /* Finally update the reader page to the new head */ 3621 /* Finally update the reader page to the new head */
3628 cpu_buffer->reader_page = reader; 3622 cpu_buffer->reader_page = reader;
3629 rb_reset_reader_page(cpu_buffer); 3623 cpu_buffer->reader_page->read = 0;
3630 3624
3631 if (overwrite != cpu_buffer->last_overrun) { 3625 if (overwrite != cpu_buffer->last_overrun) {
3632 cpu_buffer->lost_events = overwrite - cpu_buffer->last_overrun; 3626 cpu_buffer->lost_events = overwrite - cpu_buffer->last_overrun;
@@ -3636,6 +3630,10 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
3636 goto again; 3630 goto again;
3637 3631
3638 out: 3632 out:
3633 /* Update the read_stamp on the first event */
3634 if (reader && reader->read == 0)
3635 cpu_buffer->read_stamp = reader->page->time_stamp;
3636
3639 arch_spin_unlock(&cpu_buffer->lock); 3637 arch_spin_unlock(&cpu_buffer->lock);
3640 local_irq_restore(flags); 3638 local_irq_restore(flags);
3641 3639