Skip to content

Commit

Permalink
ring-buffer: Check for end of page in iterator
Browse files Browse the repository at this point in the history
If the iterator comes to an empty page for some reason, or if
the page is emptied by a consuming read. The iterator code currently
does not check if the iterator is pass the contents, and may
return a false entry.

This patch adds a check to the ring buffer iterator to test if the
current page has been completely read and sets the iterator to the
next page if necessary.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Steven Rostedt authored and Steven Rostedt committed Jan 26, 2010
1 parent 492a74f commit 3c05d74
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions kernel/trace/ring_buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -3064,9 +3064,6 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
struct ring_buffer_event *event;
int nr_loops = 0;

if (ring_buffer_iter_empty(iter))
return NULL;

cpu_buffer = iter->cpu_buffer;
buffer = cpu_buffer->buffer;

Expand All @@ -3080,6 +3077,9 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
rb_iter_reset(iter);

again:
if (ring_buffer_iter_empty(iter))
return NULL;

/*
* We repeat when a timestamp is encountered.
* We can get multiple timestamps by nested interrupts or also
Expand All @@ -3094,6 +3094,11 @@ rb_iter_peek(struct ring_buffer_iter *iter, u64 *ts)
if (rb_per_cpu_empty(cpu_buffer))
return NULL;

if (iter->head >= local_read(&iter->head_page->page->commit)) {
rb_inc_iter(iter);
goto again;
}

event = rb_iter_head_event(iter);

switch (event->type_len) {
Expand Down

0 comments on commit 3c05d74

Please sign in to comment.