ring-buffer: fix ring_buffer_read crossing pages
authorSteven Rostedt <srostedt@redhat.com>
Thu, 3 Sep 2009 14:02:09 +0000 (10:02 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Fri, 4 Sep 2009 15:28:39 +0000 (11:28 -0400)
commit7e9391cfedce34eb9786bfa69d7d545dc93ef930
treee3901037e9269cbf10bd2952835ebcc573e5741d
parent1b959e18c4d6b4b981f887260b0f8e7939efa411
ring-buffer: fix ring_buffer_read crossing pages

When the ring buffer uses an iterator (static read mode, not on the
fly reading), when it crosses a page boundery, it will skip the first
entry on the next page. The reason is that the last entry of a page
is usually padding if the page is not full. The padding will not be
returned to the user.

The problem arises on ring_buffer_read because it also increments the
iterator. Because both the read and peek use the same rb_iter_peek,
the rb_iter_peak will return the padding but also increment to the next
item. This is because the ring_buffer_peek will not incerment it
itself.

The ring_buffer_read will increment it again and then call rb_iter_peek
again to get the next item. But that will be the second item, not the
first one on the page.

The reason this never showed up before, is because the ftrace utility
always calls ring_buffer_peek first and only uses ring_buffer_read
to increment to the next item. The ring_buffer_peek will always keep
the pointer to a valid item and not padding. This just hid the bug.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/ring_buffer.c