• Steven Rostedt (Google)'s avatar
    ring-buffer: Update "shortest_full" in polling · 1e0cb399
    Steven Rostedt (Google) authored
    It was discovered that the ring buffer polling was incorrectly stating
    that read would not block, but that's because polling did not take into
    account that reads will block if the "buffer-percent" was set. Instead,
    the ring buffer polling would say reads would not block if there was any
    data in the ring buffer. This was incorrect behavior from a user space
    point of view. This was fixed by commit 42fb0a1e by having the polling
    code check if the ring buffer had more data than what the user specified
    "buffer percent" had.
    
    The problem now is that the polling code did not register itself to the
    writer that it wanted to wait for a specific "full" value of the ring
    buffer. The result was that the writer would wake the polling waiter
    whenever there was a new event. The polling waiter would then wake up, see
    that there's not enough data in the ring buffer to notify user space and
    then go back to sleep. The next event would wake it up again.
    
    Before the polling fix was added, the code would wake up around 100 times
    for a hackbench 30 benchmark. After the "fix", due to the constant waking
    of the writer, it would wake up over 11,0000 times! It would never leave
    the kernel, so the user space behavior was still "correct", but this
    definitely is not the desired effect.
    
    To fix this, have the polling code add what it's waiting for to the
    "shortest_full" variable, to tell the writer not to wake it up if the
    buffer is not as full as it expects to be.
    
    Note, after this fix, it appears that the waiter is now woken up around 2x
    the times it was before (~200). This is a tremendous improvement from the
    11,000 times, but I will need to spend some time to see why polling is
    more aggressive in its wakeups than the read blocking code.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20230929180113.01c2cae3@rorschach.local.home
    
    Cc: stable@vger.kernel.org
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Fixes: 42fb0a1e ("tracing/ring-buffer: Have polling block on watermark")
    Reported-by: default avatarJulia Lawall <julia.lawall@inria.fr>
    Tested-by: default avatarJulia Lawall <julia.lawall@inria.fr>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    1e0cb399
ring_buffer.c 166 KB