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)), |
2208d8b5 | 29 | size_t offset) |
c7ea8487 MD |
30 | { |
31 | size_t size = 0; | |
32 | ||
b5457df5 | 33 | size += lttng_ust_ring_buffer_align(offset, lttng_ust_rb_alignof(int)); |
c7ea8487 MD |
34 | size += sizeof(int); |
35 | return size; | |
36 | } | |
37 | ||
38 | static | |
4e48b5d2 | 39 | void cpu_id_record(void *priv __attribute__((unused)), |
b5457df5 | 40 | struct lttng_ust_ring_buffer_ctx *ctx, |
e7bc0ef6 | 41 | struct lttng_ust_channel_buffer *chan) |
c7ea8487 MD |
42 | { |
43 | int cpu; | |
44 | ||
45 | cpu = lttng_ust_get_cpu(); | |
8936b6c0 | 46 | chan->ops->event_write(ctx, &cpu, sizeof(cpu), lttng_ust_rb_alignof(cpu)); |
c7ea8487 MD |
47 | } |
48 | ||
49 | static | |
4e48b5d2 | 50 | void cpu_id_get_value(void *priv __attribute__((unused)), |
daacdbfc | 51 | struct lttng_ust_ctx_value *value) |
c7ea8487 | 52 | { |
6e9ac4ae | 53 | value->u.s64 = lttng_ust_get_cpu(); |
c7ea8487 MD |
54 | } |
55 | ||
4e48b5d2 MD |
56 | static const struct lttng_ust_ctx_field *ctx_field = lttng_ust_static_ctx_field( |
57 | lttng_ust_static_event_field("cpu_id", | |
58 | lttng_ust_static_type_integer(sizeof(int) * CHAR_BIT, | |
59 | lttng_ust_rb_alignof(int) * CHAR_BIT, | |
60 | lttng_ust_is_signed_type(int), | |
baa8acf3 | 61 | LTTNG_UST_BYTE_ORDER, 10), |
4e48b5d2 MD |
62 | false, false), |
63 | cpu_id_get_size, | |
64 | cpu_id_record, | |
65 | cpu_id_get_value, | |
66 | NULL, NULL); | |
67 | ||
daacdbfc | 68 | int lttng_add_cpu_id_to_ctx(struct lttng_ust_ctx **ctx) |
c7ea8487 | 69 | { |
a084756d | 70 | int ret; |
c7ea8487 | 71 | |
4e48b5d2 | 72 | if (lttng_find_context(*ctx, ctx_field->event_field->name)) { |
a084756d MD |
73 | ret = -EEXIST; |
74 | goto error_find_context; | |
c7ea8487 | 75 | } |
4e48b5d2 MD |
76 | ret = lttng_ust_context_append(ctx, ctx_field); |
77 | if (ret) | |
78 | return ret; | |
c7ea8487 | 79 | return 0; |
a084756d | 80 | |
a084756d | 81 | error_find_context: |
a084756d | 82 | return ret; |
c7ea8487 | 83 | } |