]> git.baikalelectronics.ru Git - kernel.git/commit
ring-buffer: Include dropped pages in counting dirty patches
authorSteven Rostedt (Google) <rostedt@goodmis.org>
Fri, 21 Oct 2022 16:30:13 +0000 (12:30 -0400)
committerSteven Rostedt (Google) <rostedt@goodmis.org>
Wed, 16 Nov 2022 23:08:29 +0000 (18:08 -0500)
commit06433501b5938b4ade520420568642aeaa53fca5
tree249848ace46efa267e0bf458fb850015621a2793
parent91cd29d9297dab1f8daee5d30a1b0aa35ad5e8f6
ring-buffer: Include dropped pages in counting dirty patches

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: 57a63d9503ffb ("ring-buffer: Add percentage of ring buffer full to wake up reader")
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
kernel/trace/ring_buffer.c