You need to sign in or sign up before continuing.
  • Steven Rostedt (Google)'s avatar
    ring-buffer: Test last update in 32bit version of __rb_time_read() · f458a145
    Steven Rostedt (Google) authored
    Since 64 bit cmpxchg() is very expensive on 32bit architectures, the
    timestamp used by the ring buffer does some interesting tricks to be able
    to still have an atomic 64 bit number. It originally just used 60 bits and
    broke it up into two 32 bit words where the extra 2 bits were used for
    synchronization. But this was not enough for all use cases, and all 64
    bits were required.
    
    The 32bit version of the ring buffer timestamp was then broken up into 3
    32bit words using the same counter trick. But one update was not done. The
    check to see if the read operation was done without interruption only
    checked the first two words and not last one (like it had before this
    update). Fix it by making sure all three updates happen without
    interruption by comparing the initial counter with the last updated
    counter.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20231206100050.3100b7bb@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>
    Fixes: f03f2abc
    
     ("ring-buffer: Have 32 bit time stamps use all 64 bits")
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    f458a145
ring_buffer.c 166 KB