Commit | Line | Data |
---|---|---|
c7ea8487 | 1 | /* |
c0c0989a MJ |
2 | * SPDX-License-Identifier: LGPL-2.1-only |
3 | * | |
4 | * Copyright (C) 2009-2015 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
c7ea8487 MD |
5 | * |
6 | * LTTng UST CPU id context. | |
7 | * | |
8 | * Note: threads can be migrated at any point while executing the | |
9 | * tracepoint probe. This means the CPU id field (and filter) is only | |
10 | * statistical. For instance, even though a user might select a | |
11 | * cpu_id==1 filter, there may be few events recorded into the channel | |
12 | * appearing from other CPUs, due to migration. | |
c7ea8487 MD |
13 | */ |
14 | ||
3fbec7dc | 15 | #define _LGPL_SOURCE |
b4051ad8 | 16 | #include <stddef.h> |
c7ea8487 MD |
17 | #include <sys/types.h> |
18 | #include <unistd.h> | |
9af5d97a | 19 | #include <limits.h> |
c7ea8487 MD |
20 | #include <lttng/ust-events.h> |
21 | #include <lttng/ust-tracer.h> | |
247c2ecd | 22 | #include "lib/lttng-ust/getcpu.h" |
0b4b8811 | 23 | #include <lttng/ust-ringbuffer-context.h> |
c7ea8487 | 24 | |
fc80554e MJ |
25 | #include "context-internal.h" |
26 | ||
c7ea8487 | 27 | static |
4e48b5d2 | 28 | size_t cpu_id_get_size(void *priv __attribute__((unused)), |
b2e37d27 | 29 | struct lttng_ust_probe_ctx *probe_ctx __attribute__((unused)), |
2208d8b5 | 30 | size_t offset) |
c7ea8487 MD |
31 | { |
32 | size_t size = 0; | |
33 | ||
b5457df5 | 34 | size += lttng_ust_ring_buffer_align(offset, lttng_ust_rb_alignof(int)); |
c7ea8487 MD |
35 | size += sizeof(int); |
36 | return size; | |
37 | } | |
38 | ||
39 | static | |
4e48b5d2 | 40 | void cpu_id_record(void *priv __attribute__((unused)), |
b2e37d27 MD |
41 | struct lttng_ust_probe_ctx *probe_ctx __attribute__((unused)), |
42 | struct lttng_ust_ring_buffer_ctx *ctx, | |
43 | struct lttng_ust_channel_buffer *chan) | |
c7ea8487 MD |
44 | { |
45 | int cpu; | |
46 | ||
47 | cpu = lttng_ust_get_cpu(); | |
8936b6c0 | 48 | chan->ops->event_write(ctx, &cpu, sizeof(cpu), lttng_ust_rb_alignof(cpu)); |
c7ea8487 MD |
49 | } |
50 | ||
51 | static | |
4e48b5d2 | 52 | void cpu_id_get_value(void *priv __attribute__((unused)), |
b2e37d27 | 53 | struct lttng_ust_probe_ctx *probe_ctx __attribute__((unused)), |
daacdbfc | 54 | struct lttng_ust_ctx_value *value) |
c7ea8487 | 55 | { |
6e9ac4ae | 56 | value->u.s64 = lttng_ust_get_cpu(); |
c7ea8487 MD |
57 | } |
58 | ||
4e48b5d2 MD |
59 | static const struct lttng_ust_ctx_field *ctx_field = lttng_ust_static_ctx_field( |
60 | lttng_ust_static_event_field("cpu_id", | |
61 | lttng_ust_static_type_integer(sizeof(int) * CHAR_BIT, | |
62 | lttng_ust_rb_alignof(int) * CHAR_BIT, | |
63 | lttng_ust_is_signed_type(int), | |
baa8acf3 | 64 | LTTNG_UST_BYTE_ORDER, 10), |
4e48b5d2 MD |
65 | false, false), |
66 | cpu_id_get_size, | |
67 | cpu_id_record, | |
68 | cpu_id_get_value, | |
69 | NULL, NULL); | |
70 | ||
daacdbfc | 71 | int lttng_add_cpu_id_to_ctx(struct lttng_ust_ctx **ctx) |
c7ea8487 | 72 | { |
a084756d | 73 | int ret; |
c7ea8487 | 74 | |
4e48b5d2 | 75 | if (lttng_find_context(*ctx, ctx_field->event_field->name)) { |
a084756d MD |
76 | ret = -EEXIST; |
77 | goto error_find_context; | |
c7ea8487 | 78 | } |
4e48b5d2 MD |
79 | ret = lttng_ust_context_append(ctx, ctx_field); |
80 | if (ret) | |
81 | return ret; | |
c7ea8487 | 82 | return 0; |
a084756d | 83 | |
a084756d | 84 | error_find_context: |
a084756d | 85 | return ret; |
c7ea8487 | 86 | } |