• Zheng Yejian's avatar
    ring-buffer: Fix wrong stat of cpu_buffer->read · 2d093282
    Zheng Yejian authored
    When pages are removed in rb_remove_pages(), 'cpu_buffer->read' is set
    to 0 in order to make sure any read iterators reset themselves. However,
    this will mess 'entries' stating, see following steps:
    
      # cd /sys/kernel/tracing/
      # 1. Enlarge ring buffer prepare for later reducing:
      # echo 20 > per_cpu/cpu0/buffer_size_kb
      # 2. Write a log into ring buffer of cpu0:
      # taskset -c 0 echo "hello1" > trace_marker
      # 3. Read the log:
      # cat per_cpu/cpu0/trace_pipe
           <...>-332     [000] .....    62.406844: tracing_mark_write: hello1
      # 4. Stop reading and see the stats, now 0 entries, and 1 event readed:
      # cat per_cpu/cpu0/stats
       entries: 0
       [...]
       read events: 1
      # 5. Reduce the ring buffer
      # echo 7 > per_cpu/cpu0/buffer_size_kb
      # 6. Now entries became unexpected 1 because actually no entries!!!
      # cat per_cpu/cpu0/stats
       entries: 1
       [...]
       read events: 0
    
    To fix it, introduce 'page_removed' field to count total removed pages
    since last reset, then use it to let read iterators reset themselves
    instead of changing the 'read' pointer.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20230724054040.3489499-1-zhengyejian1@huawei.com
    
    Cc: <mhiramat@kernel.org>
    Cc: <vnagarnaik@google.com>
    Fixes: 83f40318 ("ring-buffer: Make removal of ring buffer pages atomic")
    Signed-off-by: default avatarZheng Yejian <zhengyejian1@huawei.com>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    2d093282
ring_buffer.c 165 KB