• Steven Rostedt's avatar
    ring-buffer: Fix uninitialized read_stamp · a5fb8331
    Steven Rostedt authored
    The ring buffer reader page is used to swap a page from the writable
    ring buffer. If the writer happens to be on that page, it ends up on the
    reader page, but will simply move off of it, back into the writable ring
    buffer as writes are added.
    
    The time stamp passed back to the readers is stored in the cpu_buffer per
    CPU descriptor. This stamp is updated when a swap of the reader page takes
    place, and it reads the current stamp from the page taken from the writable
    ring buffer. Everytime a writer goes to a new page, it updates the time stamp
    of that page.
    
    The problem happens if a reader reads a page from an empty per CPU ring buffer.
    If the buffer is empty, the swap still takes place, placing the writer at the
    start of the reader page. If at a later time, a write happens, it updates the
    page's time stamp and continues. But the problem is that the read_stamp does
    not get updated, because the page was already swapped.
    
    The solution to this was to not swap the page if the ring buffer happens to
    be empty. This also removes the side effect that the writes on the reader
    page will not get updated because the writer never gets back on the reader
    page without a swap. That is, if a read happens on an empty buffer, but then
    no reads happen for a while. If a swap took place, and the writer were to start
    writing a lot of data (function tracer), it will start overflowing the ring buffer
    and overwrite the older data. But because the writer never goes back onto the
    reader page, the data left on the reader page never gets overwritten. This
    causes the reader to see really old data, followed by a jump to newer data.
    
    Link: http://lkml.kernel.org/r/1340060577-9112-1-git-send-email-dhsharp@google.com
    Google-Bug-Id: 6410455
    Reported-by: default avatarDavid Sharp <dhsharp@google.com>
    tested-by: default avatarDavid Sharp <dhsharp@google.com>
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    a5fb8331
ring_buffer.c 112 KB