lkml.org 
[lkml]   [2009]   [Jan]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 09/94] ring-buffer: fix dangling commit race
    2.6.28-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Steven Rostedt <srostedt@redhat.com>

    commit a8ccf1d6f60e3e6ae63122e02378cd4d40dd4aac upstream.

    Impact: fix stuck trace-buffers

    If an interrupt comes in during the rb_set_commit_to_write and
    pushes the tail page forward just at the right time, the commit
    updates will miss the adding of the interrupt data. This will
    cause the commit pointer to cease from moving forward.

    Thanks to Jiaying Zhang for finding this race.

    Reported-by: Jiaying Zhang <jiayingz@google.com>
    Signed-off-by: Steven Rostedt <srostedt@redhat.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    kernel/trace/ring_buffer.c | 12 ++++++++++++
    1 file changed, 12 insertions(+)

    --- a/kernel/trace/ring_buffer.c
    +++ b/kernel/trace/ring_buffer.c
    @@ -769,6 +769,7 @@ rb_set_commit_to_write(struct ring_buffe
    * back to us). This allows us to do a simple loop to
    * assign the commit to the tail.
    */
    + again:
    while (cpu_buffer->commit_page != cpu_buffer->tail_page) {
    cpu_buffer->commit_page->commit =
    cpu_buffer->commit_page->write;
    @@ -783,6 +784,17 @@ rb_set_commit_to_write(struct ring_buffe
    cpu_buffer->commit_page->write;
    barrier();
    }
    +
    + /* again, keep gcc from optimizing */
    + barrier();
    +
    + /*
    + * If an interrupt came in just after the first while loop
    + * and pushed the tail page forward, we will be left with
    + * a dangling commit that will never go forward.
    + */
    + if (unlikely(cpu_buffer->commit_page != cpu_buffer->tail_page))
    + goto again;
    }

    static void rb_reset_reader_page(struct ring_buffer_per_cpu *cpu_buffer)


    \
     
     \ /
      Last update: 2009-01-15 21:09    [W:3.211 / U:0.500 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site