• Steven Rostedt (Google)'s avatar
    ring-buffer: Do not try to put back write_stamp · dd939425
    Steven Rostedt (Google) authored
    If an update to an event is interrupted by another event between the time
    the initial event allocated its buffer and where it wrote to the
    write_stamp, the code try to reset the write stamp back to the what it had
    just overwritten. It knows that it was overwritten via checking the
    before_stamp, and if it didn't match what it wrote to the before_stamp
    before it allocated its space, it knows it was overwritten.
    
    To put back the write_stamp, it uses the before_stamp it read. The problem
    here is that by writing the before_stamp to the write_stamp it makes the
    two equal again, which means that the write_stamp can be considered valid
    as the last timestamp written to the ring buffer. But this is not
    necessarily true. The event that interrupted the event could have been
    interrupted in a way that it was interrupted as well, and can end up
    leaving with an invalid write_stamp. But if this happens and returns to
    this context that uses the before_stamp to update the write_stamp again,
    it can possibly incorrectly make it valid, causing later events to have in
    correct time stamps.
    
    As it is OK to leave this function with an invalid write_stamp (one that
    doesn't match the before_stamp), there's no reason to try to make it valid
    again in this case. If this race happens, then just leave with the invalid
    write_stamp and the next event to come along will just add a absolute
    timestamp and validate everything again.
    
    Bonus points: This gets rid of another cmpxchg64!
    
    Link: https://lore.kernel.org/linux-trace-kernel/20231214222921.193037a7@gandalf.local.home
    
    Cc: stable@vger.kernel.org
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Joel Fernandes <joel@joelfernandes.org>
    Cc: Vincent Donnefort <vdonnefort@google.com>
    Fixes: a389d86f
    
     ("ring-buffer: Have nested events still record running time stamp")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    dd939425
ring_buffer.c 165 KB