[PATCH] libtraceevent: Save missed events in kbuffer_read_buffer()
Steven Rostedt <[email protected]> Fri, 30 May 2025 17:22:37 -0400
| Newsgroups | org.kernel.vger.linux-trace-devel |
|---|---|
| Message-ID | <[email protected]> |
From: "Steven Rostedt (Google)" <[email protected]> When reading events from a kbuffer, if the kbuf has missed events make sure to pass that information to the buffer passed to it. Signed-off-by: Steven Rostedt (Google) <[email protected]> --- src/kbuffer-parse.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/kbuffer-parse.c b/src/kbuffer-parse.c index 9b72780..71291ad 100644 --- a/src/kbuffer-parse.c +++ b/src/kbuffer-parse.c @@ -958,6 +958,7 @@ int kbuffer_read_buffer(struct kbuffer *kbuf, void *buffer, int len) unsigned long long ts; unsigned int type_len_ts; bool do_swap = false; + int buf_len = len; int last_next; int save_curr; @@ -1009,6 +1010,33 @@ int kbuffer_read_buffer(struct kbuffer *kbuf, void *buffer, int len) write_4(do_swap, buffer + kbuf->start, type_len_ts); + /* + * If reading the first event and there are lost events, add it + * to the buffer. + */ + if (!save_curr && kbuf->lost_events) { + unsigned long long cnt_8; + unsigned int cnt_4; + int word_size; + + if (kbuf->flags & KBUFFER_FL_LONG_8) + word_size = sizeof(cnt_8); + else + word_size = sizeof(cnt_4); + + if (len + kbuf->start <= word_size + buf_len) { + if (word_size == sizeof(cnt_8)) { + cnt_8 = kbuf->lost_events; + write_8(do_swap, buffer + len + kbuf->start, cnt_8); + } else { + cnt_4 = kbuf->lost_events; + write_4(do_swap, buffer + len + kbuf->start, cnt_4); + } + len |= MISSING_STORED; + } + len |= MISSING_EVENTS; + } + /* Update the size */ if (kbuf->read_long == __read_long_8) write_8(do_swap, buffer + 8, len); -- 2.47.2