[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