From: "Tzvetomir Stoyanov (VMware)" <tz.stoyanov@xxxxxxxxx> The first record in a ring buffer page may not allways be at the beginning of the page. There could be time-extends injected before it. In this case kbuffer_start_of_data() will not return the first record, as expected. Additional field "start" is added in kbuffer struct, to hold the offset of the first record from the page and kbuffer_start_of_data() is modified to use it. Link: https://lore.kernel.org/linux-trace-devel/20200706154714.27566-1-tz.stoyanov@xxxxxxxxx Signed-off-by: Steven Rostedt (VMware) <rostedt@xxxxxxxxxxx> [ Finished the patch from Steven ] Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@xxxxxxxxx> --- lib/traceevent/kbuffer-parse.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/traceevent/kbuffer-parse.c b/lib/traceevent/kbuffer-parse.c index 2c5f00a9e786..844db976b38c 100644 --- a/lib/traceevent/kbuffer-parse.c +++ b/lib/traceevent/kbuffer-parse.c @@ -35,6 +35,7 @@ enum { * @next - offset from @data to the start of next event * @size - The size of data on @data * @start - The offset from @subbuffer where @data lives + * @first - The offset from @subbuffer where the first non time stamp event lives * * @read_4 - Function to read 4 raw bytes (may swap) * @read_8 - Function to read 8 raw bytes (may swap) @@ -51,6 +52,7 @@ struct kbuffer { unsigned int next; unsigned int size; unsigned int start; + unsigned int first; unsigned int (*read_4)(void *ptr); unsigned long long (*read_8)(void *ptr); @@ -546,6 +548,9 @@ int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer) next_event(kbuf); + /* save the first record from the page */ + kbuf->first = kbuf->curr; + return 0; } @@ -755,7 +760,7 @@ void kbuffer_set_old_format(struct kbuffer *kbuf) */ int kbuffer_start_of_data(struct kbuffer *kbuf) { - return kbuf->start; + return kbuf->first + kbuf->start; } /** -- 2.26.2