lkml.org 
[lkml]   [2012]   [Nov]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 2/2] ring-buffer: Fix race between integrity check and readers
    From: Steven Rostedt <srostedt@redhat.com>

    The function rb_check_pages() was added to make sure the ring buffer's
    pages were sane. This check is done when the ring buffer size is modified
    as well as when the iterator is released (closing the "trace" file),
    as that was considered a non fast path and a good place to do a sanity
    check.

    The problem is that the check does not have any locks around it.
    If one process were to read the trace file, and another were to read
    the raw binary file, the check could happen while the reader is reading
    the file.

    The issues with this is that the check requires to clear the HEAD page
    before doing the full check and it restores it afterward. But readers
    require the HEAD page to exist before it can read the buffer, otherwise
    it gives a nasty warning and disables the buffer.

    By adding the reader lock around the check, this keeps the race from
    happening.

    Cc: stable@vger.kernel.org # 3.6
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    kernel/trace/ring_buffer.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
    index ec01803..4cb5e51 100644
    --- a/kernel/trace/ring_buffer.c
    +++ b/kernel/trace/ring_buffer.c
    @@ -3783,12 +3783,17 @@ void
    ring_buffer_read_finish(struct ring_buffer_iter *iter)
    {
    struct ring_buffer_per_cpu *cpu_buffer = iter->cpu_buffer;
    + unsigned long flags;

    /*
    * Ring buffer is disabled from recording, here's a good place
    - * to check the integrity of the ring buffer.
    + * to check the integrity of the ring buffer.
    + * Must prevent readers from trying to read, as the check
    + * clears the HEAD page and readers require it.
    */
    + raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
    rb_check_pages(cpu_buffer);
    + raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);

    atomic_dec(&cpu_buffer->record_disabled);
    atomic_dec(&cpu_buffer->buffer->resize_disabled);
    --
    1.7.10.4

    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2012-11-30 17:41    [W:3.649 / U:0.524 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site