Commit | Line | Data |
---|---|---|
0f3a182f MD |
1 | /* |
2 | * SPDX-License-Identifier: MIT | |
3 | * | |
4 | * Copyright (C) 2010-2021 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
5 | * | |
6 | * Ring buffer context header. | |
7 | */ | |
8 | ||
9 | #ifndef _LTTNG_RING_BUFFER_CONTEXT_H | |
10 | #define _LTTNG_RING_BUFFER_CONTEXT_H | |
11 | ||
12 | #include <errno.h> | |
0f3a182f MD |
13 | #include <stdint.h> |
14 | #include <stddef.h> | |
15 | #include <urcu/arch.h> | |
16 | #include <string.h> | |
3d3a2bb8 MJ |
17 | |
18 | #include <lttng/ust-tracer.h> | |
eae3c729 | 19 | #include <lttng/ust-utils.h> |
0f3a182f MD |
20 | #include <lttng/ust-compiler.h> |
21 | ||
22 | struct lttng_ust_lib_ring_buffer; | |
23 | struct lttng_ust_lib_ring_buffer_channel; | |
24 | struct lttng_ust_lib_ring_buffer_ctx; | |
8936b6c0 | 25 | struct lttng_ust_lib_ring_buffer_ctx_private; |
0f3a182f MD |
26 | |
27 | /* | |
28 | * ring buffer context | |
29 | * | |
0f3a182f MD |
30 | * IMPORTANT: this structure is part of the ABI between the probe and |
31 | * UST. Fields need to be only added at the end, never reordered, never | |
32 | * removed. | |
33 | * | |
34 | * The field @struct_size should be used to determine the size of the | |
35 | * structure. It should be queried before using additional fields added | |
36 | * at the end of the structure. | |
37 | */ | |
38 | struct lttng_ust_lib_ring_buffer_ctx { | |
07539b34 | 39 | uint32_t struct_size; /* Size of this structure. */ |
0f3a182f | 40 | |
8936b6c0 | 41 | void *client_priv; /* Ring buffer client private data */ |
07539b34 MD |
42 | size_t data_size; /* size of payload */ |
43 | int largest_align; /* | |
44 | * alignment of the largest element | |
45 | * in the payload | |
46 | */ | |
07539b34 MD |
47 | void *ip; /* caller ip address */ |
48 | ||
8936b6c0 MD |
49 | /* Private ring buffer context, set by reserve callback. */ |
50 | struct lttng_ust_lib_ring_buffer_ctx_private *priv; | |
0f3a182f MD |
51 | |
52 | /* End of base ABI. Fields below should be used after checking struct_size. */ | |
53 | }; | |
54 | ||
55 | /** | |
3b8bedd8 | 56 | * lttng_ust_lib_ring_buffer_ctx_init - initialize ring buffer context |
0f3a182f | 57 | * @ctx: ring buffer context to initialize |
8936b6c0 | 58 | * @client_priv: client private data |
0f3a182f MD |
59 | * @data_size: size of record data payload |
60 | * @largest_align: largest alignment within data payload types | |
8936b6c0 | 61 | * @ip: caller ip address |
0f3a182f | 62 | */ |
106ff4da | 63 | static inline |
3b8bedd8 | 64 | void lttng_ust_lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, |
8936b6c0 | 65 | void *client_priv, size_t data_size, int largest_align, |
106ff4da MJ |
66 | void *ip) |
67 | lttng_ust_notrace; | |
0f3a182f | 68 | static inline |
3b8bedd8 | 69 | void lttng_ust_lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, |
8936b6c0 MD |
70 | void *client_priv, size_t data_size, int largest_align, |
71 | void *ip) | |
0f3a182f MD |
72 | { |
73 | ctx->struct_size = sizeof(struct lttng_ust_lib_ring_buffer_ctx); | |
8936b6c0 | 74 | ctx->client_priv = client_priv; |
0f3a182f MD |
75 | ctx->data_size = data_size; |
76 | ctx->largest_align = largest_align; | |
8936b6c0 MD |
77 | ctx->ip = ip; |
78 | ctx->priv = NULL; | |
0f3a182f MD |
79 | } |
80 | ||
81 | /* | |
5f796aec | 82 | * We need to define LTTNG_UST_RING_BUFFER_ALIGN_ATTR so it is known early at |
0f3a182f MD |
83 | * compile-time. We have to duplicate the "config->align" information and the |
84 | * definition here because config->align is used both in the slow and fast | |
5f796aec MJ |
85 | * paths, but LTTNG_UST_RING_BUFFER_ALIGN_ATTR is only available for the client |
86 | * code. | |
0f3a182f | 87 | */ |
5f796aec | 88 | #ifdef LTTNG_UST_RING_BUFFER_NATURAL_ALIGN |
0f3a182f | 89 | |
5f796aec | 90 | # define LTTNG_UST_RING_BUFFER_ALIGN_ATTR /* Default arch alignment */ |
0f3a182f MD |
91 | |
92 | /* | |
3b8bedd8 | 93 | * lttng_ust_lib_ring_buffer_align - Calculate the offset needed to align the type. |
5f796aec MJ |
94 | * @align_drift: object offset from an "alignment"-aligned address. |
95 | * @size_of_type: Must be non-zero, power of 2. | |
0f3a182f | 96 | */ |
106ff4da MJ |
97 | static inline |
98 | unsigned int lttng_ust_lib_ring_buffer_align(size_t align_drift, size_t size_of_type) | |
99 | lttng_ust_notrace; | |
0f3a182f | 100 | static inline |
3b8bedd8 | 101 | unsigned int lttng_ust_lib_ring_buffer_align(size_t align_drift, size_t size_of_type) |
0f3a182f MD |
102 | { |
103 | return lttng_ust_offset_align(align_drift, size_of_type); | |
104 | } | |
105 | ||
106 | #else | |
107 | ||
5f796aec | 108 | # define LTTNG_UST_RING_BUFFER_ALIGN_ATTR __attribute__((packed)) |
0f3a182f MD |
109 | |
110 | /* | |
3b8bedd8 | 111 | * lttng_ust_lib_ring_buffer_align - Calculate the offset needed to align the type. |
5f796aec MJ |
112 | * @align_drift: object offset from an "alignment"-aligned address. |
113 | * @size_of_type: Must be non-zero, power of 2. | |
0f3a182f | 114 | */ |
106ff4da MJ |
115 | static inline |
116 | unsigned int lttng_ust_lib_ring_buffer_align(size_t align_drift, size_t size_of_type) | |
117 | lttng_ust_notrace; | |
0f3a182f | 118 | static inline |
2208d8b5 MJ |
119 | unsigned int lttng_ust_lib_ring_buffer_align(size_t align_drift __attribute__((unused)), |
120 | size_t size_of_type __attribute__((unused))) | |
0f3a182f | 121 | { |
5f796aec MJ |
122 | /* |
123 | * On architectures with efficient unaligned memory access, the content | |
124 | * of the ringbuffer is packed and so the offset is always zero. | |
125 | */ | |
0f3a182f MD |
126 | return 0; |
127 | } | |
128 | ||
129 | #endif | |
130 | ||
0f3a182f | 131 | #endif /* _LTTNG_RING_BUFFER_CONTEXT_H */ |