[RFC,lttng-modules,01/10] Pass arguments for context size computation

Message ID 1490966239-21284-2-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
From: Francis Giraldeau <francis.giraldeau at gmail.com>

Pass same arguments to get_size_arg() than to record(). This new
operation has the same effect than get_size(), and the client code can
implement either one.

Signed-off-by: Francis Giraldeau <francis.giraldeau at gmail.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 lttng-events.h             |  3 +++
 lttng-ring-buffer-client.h | 17 ++++++++++++-----
 2 files changed, 15 insertions(+), 5 deletions(-)

Patch

diff --git a/lttng-events.h b/lttng-events.h
index f55bf66..7a618be 100644
--- a/lttng-events.h
+++ b/lttng-events.h
@@ -204,6 +204,9 @@  struct lttng_probe_ctx {
 struct lttng_ctx_field {
 	struct lttng_event_field event_field;
 	size_t (*get_size)(size_t offset);
+	size_t (*get_size_arg)(size_t offset, struct lttng_ctx_field *field,
+	                       struct lib_ring_buffer_ctx *ctx,
+	                       struct lttng_channel *chan);
 	void (*record)(struct lttng_ctx_field *field,
 		       struct lib_ring_buffer_ctx *ctx,
 		       struct lttng_channel *chan);
diff --git a/lttng-ring-buffer-client.h b/lttng-ring-buffer-client.h
index 63f2b4c..db3e1ad 100644
--- a/lttng-ring-buffer-client.h
+++ b/lttng-ring-buffer-client.h
@@ -83,7 +83,9 @@  static inline notrace u64 lib_ring_buffer_clock_read(struct channel *chan)
 }
 
 static inline
-size_t ctx_get_size(size_t offset, struct lttng_ctx *ctx)
+size_t ctx_get_size(size_t offset, struct lib_ring_buffer_ctx *bufctx,
+                    struct lttng_channel *chan,
+                    struct lttng_ctx *ctx)
 {
 	int i;
 	size_t orig_offset = offset;
@@ -91,8 +93,13 @@  size_t ctx_get_size(size_t offset, struct lttng_ctx *ctx)
 	if (likely(!ctx))
 		return 0;
 	offset += lib_ring_buffer_align(offset, ctx->largest_align);
-	for (i = 0; i < ctx->nr_fields; i++)
-		offset += ctx->fields[i].get_size(offset);
+	for (i = 0; i < ctx->nr_fields; i++) {
+		if (ctx->fields[i].get_size)
+			offset += ctx->fields[i].get_size(offset);
+		if (ctx->fields[i].get_size_arg)
+			offset += ctx->fields[i].get_size_arg(offset,
+					&ctx->fields[i], bufctx, chan);
+	}
 	return offset - orig_offset;
 }
 
@@ -170,8 +177,8 @@  size_t record_header_size(const struct lib_ring_buffer_config *config,
 		padding = 0;
 		WARN_ON_ONCE(1);
 	}
-	offset += ctx_get_size(offset, lttng_chan->ctx);
-	offset += ctx_get_size(offset, event->ctx);
+	offset += ctx_get_size(offset, ctx, lttng_chan, event->ctx);
+	offset += ctx_get_size(offset, ctx, lttng_chan, lttng_chan->ctx);
 
 	*pre_header_padding = padding;
 	return offset - orig_offset;