lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 073/390] ring-buffer: Allow splice to read previous partially read pages
    Date
    From: Steven Rostedt (Google) <rostedt@goodmis.org>

    commit fa8f4a89736b654125fb254b0db753ac68a5fced upstream.

    If a page is partially read, and then the splice system call is run
    against the ring buffer, it will always fail to read, no matter how much
    is in the ring buffer. That's because the code path for a partial read of
    the page does will fail if the "full" flag is set.

    The splice system call wants full pages, so if the read of the ring buffer
    is not yet full, it should return zero, and the splice will block. But if
    a previous read was done, where the beginning has been consumed, it should
    still be given to the splice caller if the rest of the page has been
    written to.

    This caused the splice command to never consume data in this scenario, and
    let the ring buffer just fill up and lose events.

    Link: https://lkml.kernel.org/r/20220927144317.46be6b80@gandalf.local.home

    Cc: stable@vger.kernel.org
    Fixes: 8789a9e7df6bf ("ring-buffer: read page interface")
    Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    kernel/trace/ring_buffer.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    --- a/kernel/trace/ring_buffer.c
    +++ b/kernel/trace/ring_buffer.c
    @@ -5341,7 +5341,15 @@ int ring_buffer_read_page(struct trace_b
    unsigned int pos = 0;
    unsigned int size;

    - if (full)
    + /*
    + * If a full page is expected, this can still be returned
    + * if there's been a previous partial read and the
    + * rest of the page can be read and the commit page is off
    + * the reader page.
    + */
    + if (full &&
    + (!read || (len < (commit - read)) ||
    + cpu_buffer->reader_page == cpu_buffer->commit_page))
    goto out_unlock;

    if (len > (commit - read))

    \
     
     \ /
      Last update: 2022-10-24 18:12    [W:4.018 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site