• Steven Rostedt (Google)'s avatar
    ring-buffer: Include dropped pages in counting dirty patches · 31029a8b
    Steven Rostedt (Google) authored
    The function ring_buffer_nr_dirty_pages() was created to find out how many
    pages are filled in the ring buffer. There's two running counters. One is
    incremented whenever a new page is touched (pages_touched) and the other
    is whenever a page is read (pages_read). The dirty count is the number
    touched minus the number read. This is used to determine if a blocked task
    should be woken up if the percentage of the ring buffer it is waiting for
    is hit.
    
    The problem is that it does not take into account dropped pages (when the
    new writes overwrite pages that were not read). And then the dirty pages
    will always be greater than the percentage.
    
    This makes the "buffer_percent" file inaccurate, as the number of dirty
    pages end up always being larger than the percentage, event when it's not
    and this causes user space to be woken up more than it wants to be.
    
    Add a new counter to keep track of lost pages, and include that in the
    accounting of dirty pages so that it is actually accurate.
    
    Link: https://lkml.kernel.org/r/20221021123013.55fb6055@gandalf.local.home
    
    Fixes: 2c2b0a78
    
     ("ring-buffer: Add percentage of ring buffer full to wake up reader")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    31029a8b
ring_buffer.c 164 KB