[RFC,lttng-modules,07/10] Fix callstack context: write empty sequence if no stack trace

Message ID 1490966239-21284-8-git-send-email-mathieu.desnoyers@efficios.com
State RFC
Headers show
Series
  • Callstack context for kernel tracer
Related show

Commit Message

Mathieu Desnoyers March 31, 2017, 1:17 p.m. UTC
The trace content needs to match the metadata, else the trace will be
corrupted.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 lttng-context-callstack.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

Patch

diff --git a/lttng-context-callstack.c b/lttng-context-callstack.c
index 3b7859e..57738be 100644
--- a/lttng-context-callstack.c
+++ b/lttng-context-callstack.c
@@ -156,8 +156,12 @@  size_t lttng_callstack_get_size(size_t offset, struct lttng_ctx_field *field,
 
 	/* do not write data if no space is available */
 	trace = stack_trace_context(field, ctx);
-	if (!trace)
-		return 0;
+	if (unlikely(!trace)) {
+		size += lib_ring_buffer_align(offset, lttng_alignof(unsigned int));
+		size += sizeof(unsigned int);
+		size += lib_ring_buffer_align(offset, lttng_alignof(unsigned long));
+		return size;
+	}
 
 	/* reset stack trace, no need to clear memory */
 	trace->nr_entries = 0;
@@ -191,8 +195,13 @@  void lttng_callstack_record(struct lttng_ctx_field *field,
 	struct stack_trace *trace = stack_trace_context(field, ctx);
 	unsigned int nr_seq_entries;
 
-	if (!trace)
+	if (unlikely(!trace)) {
+		nr_seq_entries = 0;
+		lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int));
+		chan->ops->event_write(ctx, &nr_seq_entries, sizeof(unsigned int));
+		lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned long));
 		return;
+	}
 	lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int));
 	nr_seq_entries = trace->nr_entries;
 	if (trace->nr_entries == trace->max_entries)