On Fri, 12 Jan 2024 10:06:41 -0500
Steven Rostedt <rost...@goodmis.org> wrote:

> I'm thinking both may be good, as the number of dropped events are not
> added if there's no room to put it at the end of the ring buffer. When
> there's no room, it just sets a flag that there was missed events but
> doesn't give how many events were missed.
> 
> If anything, it should be in both locations. In the sub-buffer header, to
> be consistent with the read/splice version, and in the meta page were if
> there's no room to add the count, it can be accessed in the meta page.

I think  the meta data page should look like this:

struct trace_buffer_meta {
        __u32           meta_page_size;
        __u32           meta_struct_len;
 
        __u32           subbuf_size;
        __u32           nr_subbufs;
 
        struct {
                __u64           lost_events;
                __u32           id;
                __u32           read;
        } reader;
 
        __u64   entries;
        __u64   overrun;
        __u64   read;

};

1) meta_page_size

      The size of this meta page. It's the first thing the application
      needs to know how much to mmap.

2) meta_struct_len

      The actual length of the structure. It's the second thing the
      application will look at to know what version it is dealing with.

3) subbuf_size
4) nr_subbufs

      The next two is the next thing the application should do. That is to
      memory map in all the sub-buffers. With 1) and this, it knows how to
      do that.

The first four are needed for setup, and never changes once mapped. The
rest gets updated during the trace.

5) reader
  5a) lost_events
  5b) id
  5c) read

      This is actively needed during tracing. It is what is used to know
      where and how to read the reader sub-buffer.

6) entries
7) overrun
8) read

      These are useful statistics, but probably seldom really looked at.
      They should be at the end.

Also notice that I converted all "unsigned long" to __u64. This is because
it is possible to have a 32 bit userspace running this on top of a 64 bit
kernel. If we were to use "long" it would be inconsistent and buggy.

Now if you need subbufs_touched and subbufs_lost. When that gets opened, it
would update the  meta_struct_len accordingly, and the structure would look
like:

struct trace_buffer_meta {
        __u32           meta_page_size;
        __u32           meta_struct_len;
 
        __u32           subbuf_size;
        __u32           nr_subbufs;
 
        struct {
                __u64           lost_events;
                __u32           id;
                __u32           read;
        } reader;
 
        __u64   entries;
        __u64   overrun;
        __u64   read;

        __u64   subbufs_touched;
        __u64   subbufs_lost;
};


Make sense?

-- Steve

Reply via email to