• Zheng Yejian's avatar
    ring-buffer: Fix bytes info in per_cpu buffer stats · 45d99ea4
    Zheng Yejian authored
    The 'bytes' info in file 'per_cpu/cpu<X>/stats' means the number of
    bytes in cpu buffer that have not been consumed. However, currently
    after consuming data by reading file 'trace_pipe', the 'bytes' info
    was not changed as expected.
    
      # cat per_cpu/cpu0/stats
      entries: 0
      overrun: 0
      commit overrun: 0
      bytes: 568             <--- 'bytes' is problematical !!!
      oldest event ts:  8651.371479
      now ts:  8653.912224
      dropped events: 0
      read events: 8
    
    The root cause is incorrect stat on cpu_buffer->read_bytes. To fix it:
      1. When stat 'read_bytes', account consumed event in rb_advance_reader();
      2. When stat 'entries_bytes', exclude the discarded padding event which
         is smaller than minimum size because it is invisible to reader. Then
         use rb_page_commit() instead of BUF_PAGE_SIZE at where accounting for
         page-based read/remove/overrun.
    
    Also correct the comments of ring_buffer_bytes_cpu() in this patch.
    
    Link: https://lore.kernel.org/linux-trace-kernel/20230921125425.1708423-1-zhengyejian1@huawei.com
    
    Cc: stable@vger.kernel.org
    Fixes: c64e148a ("trace: Add ring buffer stats to measure rate of events")
    Signed-off-by: default avatarZheng Yejian <zhengyejian1@huawei.com>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    45d99ea4
ring_buffer.c 166 KB