[lttng-dev] [RFC PATCH lttng-ust] callsite: add "ip" context (from ust/callsite branch)

Woegerer, Paul Paul_Woegerer at mentor.com
Wed Jul 10 05:06:23 EDT 2013


Hi Mathieu,

it would be great if your patch 'callsite: add "ip" context'
from branch ust/callsite could get merged to master.
(I fixed the conflicts, so it should apply without issues)

Your patch is the first step to enable lttng users to easily
look up the place in source that emitted a given event.

Also it allow us to get rid of our custom header file (that
did basically the same but as an extra payload field).

Other patches will follow to make things work for events that
are emitted from shared objects ( as already discussed here:
https://bugs.lttng.org/issues/474 ).

Thanks,
Paul

-- 
Paul Woegerer, SW Development Engineer
Sourcery Analyzer <http://go.mentor.com/sourceryanalyzer>
Mentor Graphics, Embedded Software Division

>From 96c9c0672f230801098f71cfa99b4739351848f0 Mon Sep 17 00:00:00 2001
From: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date: Tue, 16 Oct 2012 13:00:57 -0400
Subject: [PATCH] callsite: add "ip" context

Add caller's instruction pointer context.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 include/lttng/ringbuffer-config.h    | 11 ++++--
 include/lttng/tracepoint.h           |  9 ++++-
 include/lttng/ust-abi.h              |  1 +
 include/lttng/ust-events.h           |  1 +
 include/lttng/ust-tracepoint-event.h |  1 +
 liblttng-ust/Makefile.am             |  1 +
 liblttng-ust/lttng-context-ip.c      | 73 ++++++++++++++++++++++++++++++++++++
 liblttng-ust/lttng-events.c          |  2 +
 8 files changed, 94 insertions(+), 5 deletions(-)
 create mode 100644 liblttng-ust/lttng-context-ip.c

diff --git a/include/lttng/ringbuffer-config.h b/include/lttng/ringbuffer-config.h
index 42889cc..3b7d348 100644
--- a/include/lttng/ringbuffer-config.h
+++ b/include/lttng/ringbuffer-config.h
@@ -218,7 +218,8 @@ struct lttng_ust_lib_ring_buffer_config {
  * UST. Fields need to be only added at the end, never reordered, never
  * removed.
  */
-#define LTTNG_UST_RING_BUFFER_CTX_PADDING	24
+#define LTTNG_UST_RING_BUFFER_CTX_PADDING	\
+		(24 - sizeof(int) - sizeof(void *))
 struct lttng_ust_lib_ring_buffer_ctx {
 	/* input received by lib_ring_buffer_reserve(), saved here. */
 	struct channel *chan;		/* channel */
@@ -246,7 +247,9 @@ struct lttng_ust_lib_ring_buffer_ctx {
 					 */
 	uint64_t tsc;			/* time-stamp counter value */
 	unsigned int rflags;		/* reservation flags */
-	char padding[LTTNG_UST_RING_BUFFER_CTX_PADDING];
+	unsigned int padding1;		/* padding to realign on pointer */
+	void *ip;			/* caller ip address */
+	char padding2[LTTNG_UST_RING_BUFFER_CTX_PADDING];
 };
 
 /**
@@ -276,7 +279,9 @@ void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx,
 	ctx->cpu = cpu;
 	ctx->rflags = 0;
 	ctx->handle = handle;
-	memset(ctx->padding, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING);
+	ctx->padding1 = 0;
+	ctx->ip = 0;
+	memset(ctx->padding2, 0, LTTNG_UST_RING_BUFFER_CTX_PADDING);
 }
 
 /*
diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h
index 0327c11..b3b01cc 100644
--- a/include/lttng/tracepoint.h
+++ b/include/lttng/tracepoint.h
@@ -145,11 +145,16 @@ extern "C" {
 #define _TP_ARGS_DATA_VAR(...)		_TP_DATA_VAR_N(_TP_NARGS(0, ##__VA_ARGS__), ##__VA_ARGS__)
 #define _TP_PARAMS(...)			__VA_ARGS__
 
+/*
+ * The tracepoint cb is marked always inline so we can distinguish
+ * between caller's ip addresses within the probe using the return
+ * address.
+ */
 #define _DECLARE_TRACEPOINT(_provider, _name, ...)			 		\
 extern struct tracepoint __tracepoint_##_provider##___##_name;				\
-static inline lttng_ust_notrace								\
+static inline __attribute__((always_inline)) lttng_ust_notrace				\
 void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__));		\
-static inline										\
+static											\
 void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))		\
 {											\
 	struct tracepoint_probe *__tp_probe;						\
diff --git a/include/lttng/ust-abi.h b/include/lttng/ust-abi.h
index df61cde..4cc138e 100644
--- a/include/lttng/ust-abi.h
+++ b/include/lttng/ust-abi.h
@@ -137,6 +137,7 @@ enum lttng_ust_context_type {
 	LTTNG_UST_CONTEXT_VPID			= 1,
 	LTTNG_UST_CONTEXT_PTHREAD_ID		= 2,
 	LTTNG_UST_CONTEXT_PROCNAME		= 3,
+	LTTNG_UST_CONTEXT_IP			= 4,
 };
 
 #define LTTNG_UST_CONTEXT_PADDING1	16
diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h
index 329ed3a..f40c044 100644
--- a/include/lttng/ust-events.h
+++ b/include/lttng/ust-events.h
@@ -565,6 +565,7 @@ int lttng_add_vtid_to_ctx(struct lttng_ctx **ctx);
 int lttng_add_vpid_to_ctx(struct lttng_ctx **ctx);
 int lttng_add_pthread_id_to_ctx(struct lttng_ctx **ctx);
 int lttng_add_procname_to_ctx(struct lttng_ctx **ctx);
+int lttng_add_ip_to_ctx(struct lttng_ctx **ctx);
 void lttng_context_vtid_reset(void);
 void lttng_context_vpid_reset(void);
 
diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h
index 777913a..bb3a05d 100644
--- a/include/lttng/ust-tracepoint-event.h
+++ b/include/lttng/ust-tracepoint-event.h
@@ -533,6 +533,7 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))	      \
 	__event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \
 	lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len,  \
 				 __event_align, -1, __chan->handle);	      \
+	__ctx.ip = __builtin_return_address(0);				      \
 	__ret = __chan->ops->event_reserve(&__ctx, __event->id);	      \
 	if (__ret < 0)							      \
 		return;							      \
diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am
index bda7ee8..1e6401a 100644
--- a/liblttng-ust/Makefile.am
+++ b/liblttng-ust/Makefile.am
@@ -25,6 +25,7 @@ liblttng_ust_runtime_la_SOURCES = \
 	lttng-context-vpid.c \
 	lttng-context-pthread-id.c \
 	lttng-context-procname.c \
+	lttng-context-ip.c \
 	lttng-context.c \
 	lttng-events.c \
 	lttng-filter.c \
diff --git a/liblttng-ust/lttng-context-ip.c b/liblttng-ust/lttng-context-ip.c
new file mode 100644
index 0000000..6f3edf8
--- /dev/null
+++ b/liblttng-ust/lttng-context-ip.c
@@ -0,0 +1,73 @@
+/*
+ * lttng-context-ip.c
+ *
+ * LTTng UST Instruction Pointer Context.
+ *
+ * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; only
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <lttng/ust-events.h>
+#include <lttng/ust-tracer.h>
+#include <lttng/ringbuffer-config.h>
+
+static
+size_t ip_get_size(size_t offset)
+{
+	size_t size = 0;
+
+	size += lib_ring_buffer_align(offset, lttng_alignof(void *));
+	size += sizeof(void *);
+	return size;
+}
+
+static
+void ip_record(struct lttng_ctx_field *field,
+		 struct lttng_ust_lib_ring_buffer_ctx *ctx,
+		 struct lttng_channel *chan)
+{
+	void *ip;
+
+	ip = ctx->ip;
+	lib_ring_buffer_align_ctx(ctx, lttng_alignof(ip));
+	chan->ops->event_write(ctx, &ip, sizeof(ip));
+}
+
+int lttng_add_ip_to_ctx(struct lttng_ctx **ctx)
+{
+	struct lttng_ctx_field *field;
+
+	field = lttng_append_context(ctx);
+	if (!field)
+		return -ENOMEM;
+	if (lttng_find_context(*ctx, "ip")) {
+		lttng_remove_context_field(ctx, field);
+		return -EEXIST;
+	}
+	field->event_field.name = "ip";
+	field->event_field.type.atype = atype_integer;
+	field->event_field.type.u.basic.integer.size = sizeof(void *) * CHAR_BIT;
+	field->event_field.type.u.basic.integer.alignment = lttng_alignof(void *) * CHAR_BIT;
+	field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(void *);
+	field->event_field.type.u.basic.integer.reverse_byte_order = 0;
+	field->event_field.type.u.basic.integer.base = 16;
+	field->event_field.type.u.basic.integer.encoding = lttng_encode_none;
+	field->get_size = ip_get_size;
+	field->record = ip_record;
+	return 0;
+}
diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c
index 34c708f..26601a6 100644
--- a/liblttng-ust/lttng-events.c
+++ b/liblttng-ust/lttng-events.c
@@ -740,6 +740,8 @@ int lttng_attach_context(struct lttng_ust_context *context_param,
 		return lttng_add_vpid_to_ctx(ctx);
 	case LTTNG_UST_CONTEXT_PROCNAME:
 		return lttng_add_procname_to_ctx(ctx);
+	case LTTNG_UST_CONTEXT_IP:
+		return lttng_add_ip_to_ctx(ctx);
 	default:
 		return -EINVAL;
 	}
-- 
1.8.1.4





More information about the lttng-dev mailing list