[lkml]   [2009]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[PATCH 2/2] ring-buffer: do not remove reader page from list on ring buffer free
    From: Steven Rostedt <>

    Impact: prevent possible memory leak

    The reader page of the ring buffer is special. Although it points
    into the ring buffer, it is not part of the actual buffer. It is
    a page used by the reader to swap with a page in the ring buffer.
    Once the swap is made, the new reader page is again outside the

    Even though the reader page points into the buffer, it is really
    pointing to residual data. Note, this data is used by the reader.

    reader page
    (prev) +---+ (next)
    +----------| |----------+
    | +---+ |
    v v
    +---+ +---+ +---+
    -->| |------->| |------->| |--->
    <--| |<-------| |<-------| |<---
    +---+ +---+ +---+

    ^ ^ ^
    \ | /
    ------- Buffer---------

    If we perform a list_del_init() on the reader page we will actually remove
    the last page the reader swapped with and not the reader page itself.
    This will cause that page to not be freed, and thus is a memory leak.

    Luckily, the only user of the ring buffer so far is ftrace. And ftrace
    will not free its ring buffer after it allocates it. There is no current
    possible memory leak. But once there are other users, or if ftrace
    dynamically creates and frees its ring buffer, then this would be a
    memory leak.

    This patch fixes the leak for future cases.

    Signed-off-by: Steven Rostedt <>
    kernel/trace/ring_buffer.c | 1 -
    1 files changed, 0 insertions(+), 1 deletions(-)

    diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
    index edce2ff..960cbf4 100644
    --- a/kernel/trace/ring_buffer.c
    +++ b/kernel/trace/ring_buffer.c
    @@ -563,7 +563,6 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
    struct list_head *head = &cpu_buffer->pages;
    struct buffer_page *bpage, *tmp;

    - list_del_init(&cpu_buffer->reader_page->list);

    list_for_each_entry_safe(bpage, tmp, head, list) {

     \ /
      Last update: 2009-04-01 16:23    [W:0.024 / U:1.572 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site