• Steven Rostedt (Google)'s avatar
    tracing: Fix blocked reader of snapshot buffer · 39a7dc23
    Steven Rostedt (Google) authored
    If an application blocks on the snapshot or snapshot_raw files, expecting
    to be woken up when a snapshot occurs, it will not happen. Or it may
    happen with an unexpected result.
    
    That result is that the application will be reading the main buffer
    instead of the snapshot buffer. That is because when the snapshot occurs,
    the main and snapshot buffers are swapped. But the reader has a descriptor
    still pointing to the buffer that it originally connected to.
    
    This is fine for the main buffer readers, as they may be blocked waiting
    for a watermark to be hit, and when a snapshot occurs, the data that the
    main readers want is now on the snapshot buffer.
    
    But for waiters of the snapshot buffer, they are waiting for an event to
    occur that will trigger the snapshot and they can then consume it quickly
    to save the snapshot before the next snapshot occurs. But to do this, they
    need to read the new snapshot buffer, not the old one that is now
    receiving new data.
    
    Also, it does not make sense to have a watermark "buffer_percent" on the
    snapshot buffer, as the snapshot buffer is static and does not receive new
    data except all at once.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20231228095149.77f5b45d@gandalf.local.home
    
    Cc: stable@vger.kernel.org
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
    Fixes: debdd57f ("tracing: Make a snapshot feature available from userspace")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    39a7dc23
ring_buffer.c 165 KB