Implement cpu_id context for filtering
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 13 Jun 2015 09:27:07 +0000 (11:27 +0200)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 13 Jun 2015 09:27:07 +0000 (11:27 +0200)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/lttng/ust-abi.h
include/lttng/ust-events.h
liblttng-ust/Makefile.am
liblttng-ust/lttng-context-cpu-id.c [new file with mode: 0644]
liblttng-ust/lttng-context.c
liblttng-ust/lttng-events.c

index d9be99391de5b6833eecf0a736b429cb3c7e4efd..232a9b90069c7af844a3e88b16d5128e37aa4a15 100644 (file)
@@ -139,6 +139,7 @@ enum lttng_ust_context_type {
        LTTNG_UST_CONTEXT_PROCNAME              = 3,
        LTTNG_UST_CONTEXT_IP                    = 4,
        LTTNG_UST_CONTEXT_PERF_THREAD_COUNTER   = 5,
+       LTTNG_UST_CONTEXT_CPU_ID                = 6,
 };
 
 struct lttng_ust_perf_counter_ctx {
index 3d7a2747b3795329f2994115d64e1d1cefd0f138..b34c9d1ba696d19615a366e1e98ebb5273d51124 100644 (file)
@@ -599,6 +599,7 @@ 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);
+int lttng_add_cpu_id_to_ctx(struct lttng_ctx **ctx);
 void lttng_context_vtid_reset(void);
 void lttng_context_vpid_reset(void);
 
index 442b054012a57e461b135d4424757c886659c985..199fa03d81d803abd57d40e4e2d2eced8d7d5919 100644 (file)
@@ -26,6 +26,7 @@ liblttng_ust_runtime_la_SOURCES = \
        lttng-context-pthread-id.c \
        lttng-context-procname.c \
        lttng-context-ip.c \
+       lttng-context-cpu-id.c \
        lttng-context.c \
        lttng-events.c \
        lttng-filter.c \
diff --git a/liblttng-ust/lttng-context-cpu-id.c b/liblttng-ust/lttng-context-cpu-id.c
new file mode 100644 (file)
index 0000000..fb6e407
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * lttng-context-cpu-id.c
+ *
+ * LTTng UST CPU id context.
+ *
+ * Note: threads can be migrated at any point while executing the
+ * tracepoint probe. This means the CPU id field (and filter) is only
+ * statistical. For instance, even though a user might select a
+ * cpu_id==1 filter, there may be few events recorded into the channel
+ * appearing from other CPUs, due to migration.
+ *
+ * Copyright (C) 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@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
+ */
+
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <unistd.h>
+#include <lttng/ust-events.h>
+#include <lttng/ust-tracer.h>
+#include <lttng/ringbuffer-config.h>
+#include "../libringbuffer/getcpu.h"
+
+static
+size_t cpu_id_get_size(size_t offset)
+{
+       size_t size = 0;
+
+       size += lib_ring_buffer_align(offset, lttng_alignof(int));
+       size += sizeof(int);
+       return size;
+}
+
+static
+void cpu_id_record(struct lttng_ctx_field *field,
+                struct lttng_ust_lib_ring_buffer_ctx *ctx,
+                struct lttng_channel *chan)
+{
+       int cpu;
+
+       cpu = lttng_ust_get_cpu();
+       lib_ring_buffer_align_ctx(ctx, lttng_alignof(cpu));
+       chan->ops->event_write(ctx, &cpu, sizeof(cpu));
+}
+
+static
+void cpu_id_get_value(struct lttng_ctx_field *field,
+               union lttng_ctx_value *value)
+{
+       int cpu;
+
+       cpu = lttng_ust_get_cpu();
+       value->s64 = cpu;
+}
+
+int lttng_add_cpu_id_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, "cpu_id")) {
+               lttng_remove_context_field(ctx, field);
+               return -EEXIST;
+       }
+       field->event_field.name = "cpu_id";
+       field->event_field.type.atype = atype_integer;
+       field->event_field.type.u.basic.integer.size = sizeof(int) * CHAR_BIT;
+       field->event_field.type.u.basic.integer.alignment = lttng_alignof(int) * CHAR_BIT;
+       field->event_field.type.u.basic.integer.signedness = lttng_is_signed_type(int);
+       field->event_field.type.u.basic.integer.reverse_byte_order = 0;
+       field->event_field.type.u.basic.integer.base = 10;
+       field->event_field.type.u.basic.integer.encoding = lttng_encode_none;
+       field->get_size = cpu_id_get_size;
+       field->record = cpu_id_record;
+       field->get_value = cpu_id_get_value;
+       lttng_context_update(*ctx);
+       return 0;
+}
index 6cab7dc1721a57dbbd004cd84f5db4deed32072b..199ec5d578f739c8ae108a16f0c89791e1636ec0 100644 (file)
@@ -236,6 +236,10 @@ void lttng_context_init(void)
        if (ret) {
                WARN("Cannot add context lttng_add_procname_to_ctx");
        }
+       ret = lttng_add_cpu_id_to_ctx(&lttng_static_ctx);
+       if (ret) {
+               WARN("Cannot add context lttng_add_cpu_id_to_ctx");
+       }
 }
 
 void lttng_context_exit(void)
index 897b7f251e32cd77092e42d6e7572aae001a909a..25b4962583a833811014cf50558f46ea4a5aa7e3 100644 (file)
@@ -817,6 +817,8 @@ int lttng_attach_context(struct lttng_ust_context *context_param,
                return lttng_add_procname_to_ctx(ctx);
        case LTTNG_UST_CONTEXT_IP:
                return lttng_add_ip_to_ctx(ctx);
+       case LTTNG_UST_CONTEXT_CPU_ID:
+               return lttng_add_cpu_id_to_ctx(ctx);
        default:
                return -EINVAL;
        }
This page took 0.027503 seconds and 4 git commands to generate.