Skip to content

Commit b81f472

Browse files
committed
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: [email protected] # 2.6.30+ Signed-off-by: Steven Rostedt <[email protected]>
1 parent 1ec2183 commit b81f472

1 file changed

Lines changed: 5 additions & 7 deletions

File tree

kernel/trace/ring_buffer.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,12 +1887,6 @@ rb_event_index(struct ring_buffer_event *event)
18871887
return (addr & ~PAGE_MASK) - BUF_PAGE_HDR_SIZE;
18881888
}
18891889

1890-
static 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-
18961890
static void rb_inc_iter(struct ring_buffer_iter *iter)
18971891
{
18981892
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)
36263620

36273621
/* Finally update the reader page to the new head */
36283622
cpu_buffer->reader_page = reader;
3629-
rb_reset_reader_page(cpu_buffer);
3623+
cpu_buffer->reader_page->read = 0;
36303624

36313625
if (overwrite != cpu_buffer->last_overrun) {
36323626
cpu_buffer->lost_events = overwrite - cpu_buffer->last_overrun;
@@ -3636,6 +3630,10 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer)
36363630
goto again;
36373631

36383632
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+
36393637
arch_spin_unlock(&cpu_buffer->lock);
36403638
local_irq_restore(flags);
36413639

0 commit comments

Comments
 (0)