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> | |
19 | #include <lttng/ust-align.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; | |
25 | struct lttng_ust_shm_handle; | |
26 | ||
27 | /* | |
28 | * ring buffer context | |
29 | * | |
30 | * Context passed to lib_ring_buffer_reserve(), lib_ring_buffer_commit(), | |
31 | * lib_ring_buffer_try_discard_reserve(), lib_ring_buffer_align_ctx() and | |
32 | * lib_ring_buffer_write(). | |
33 | * | |
34 | * IMPORTANT: this structure is part of the ABI between the probe and | |
35 | * UST. Fields need to be only added at the end, never reordered, never | |
36 | * removed. | |
37 | * | |
38 | * The field @struct_size should be used to determine the size of the | |
39 | * structure. It should be queried before using additional fields added | |
40 | * at the end of the structure. | |
41 | */ | |
42 | struct lttng_ust_lib_ring_buffer_ctx { | |
43 | uint32_t struct_size; /* Size of this structure. */ | |
44 | ||
45 | /* input received by lib_ring_buffer_reserve(), saved here. */ | |
46 | struct lttng_ust_lib_ring_buffer_channel *chan; /* channel */ | |
47 | void *priv; /* client private data */ | |
48 | struct lttng_ust_shm_handle *handle; /* shared-memory handle */ | |
49 | size_t data_size; /* size of payload */ | |
50 | int largest_align; /* | |
51 | * alignment of the largest element | |
52 | * in the payload | |
53 | */ | |
0f3a182f MD |
54 | |
55 | /* output from lib_ring_buffer_reserve() */ | |
7489fcb4 | 56 | int reserve_cpu; /* processor id updated by the reserve */ |
0f3a182f MD |
57 | struct lttng_ust_lib_ring_buffer *buf; /* |
58 | * buffer corresponding to processor id | |
59 | * for this channel | |
60 | */ | |
61 | size_t slot_size; /* size of the reserved slot */ | |
62 | unsigned long buf_offset; /* offset following the record header */ | |
63 | unsigned long pre_offset; /* | |
64 | * Initial offset position _before_ | |
65 | * the record is written. Positioned | |
66 | * prior to record header alignment | |
67 | * padding. | |
68 | */ | |
69 | uint64_t tsc; /* time-stamp counter value */ | |
70 | unsigned int rflags; /* reservation flags */ | |
71 | void *ip; /* caller ip address */ | |
72 | struct lttng_ust_lib_ring_buffer_backend_pages *backend_pages; | |
73 | ||
74 | /* End of base ABI. Fields below should be used after checking struct_size. */ | |
75 | }; | |
76 | ||
77 | /** | |
78 | * lib_ring_buffer_ctx_init - initialize ring buffer context | |
79 | * @ctx: ring buffer context to initialize | |
80 | * @chan: channel | |
81 | * @priv: client private data | |
82 | * @data_size: size of record data payload | |
83 | * @largest_align: largest alignment within data payload types | |
0f3a182f MD |
84 | */ |
85 | static inline lttng_ust_notrace | |
86 | void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, | |
87 | struct lttng_ust_lib_ring_buffer_channel *chan, | |
88 | void *priv, size_t data_size, int largest_align, | |
7489fcb4 | 89 | struct lttng_ust_shm_handle *handle); |
0f3a182f MD |
90 | static inline |
91 | void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, | |
92 | struct lttng_ust_lib_ring_buffer_channel *chan, | |
93 | void *priv, size_t data_size, int largest_align, | |
7489fcb4 | 94 | struct lttng_ust_shm_handle *handle) |
0f3a182f MD |
95 | { |
96 | ctx->struct_size = sizeof(struct lttng_ust_lib_ring_buffer_ctx); | |
97 | ctx->chan = chan; | |
98 | ctx->priv = priv; | |
99 | ctx->data_size = data_size; | |
7489fcb4 | 100 | ctx->reserve_cpu = -1; |
0f3a182f | 101 | ctx->largest_align = largest_align; |
0f3a182f MD |
102 | ctx->rflags = 0; |
103 | ctx->handle = handle; | |
104 | ctx->ip = 0; | |
105 | } | |
106 | ||
107 | /* | |
108 | * We need to define RING_BUFFER_ALIGN_ATTR so it is known early at | |
109 | * compile-time. We have to duplicate the "config->align" information and the | |
110 | * definition here because config->align is used both in the slow and fast | |
111 | * paths, but RING_BUFFER_ALIGN_ATTR is only available for the client code. | |
112 | */ | |
113 | #ifdef RING_BUFFER_ALIGN | |
114 | ||
115 | # define RING_BUFFER_ALIGN_ATTR /* Default arch alignment */ | |
116 | ||
117 | /* | |
118 | * Calculate the offset needed to align the type. | |
119 | * size_of_type must be non-zero. | |
120 | */ | |
121 | static inline lttng_ust_notrace | |
122 | unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type); | |
123 | static inline | |
124 | unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) | |
125 | { | |
126 | return lttng_ust_offset_align(align_drift, size_of_type); | |
127 | } | |
128 | ||
129 | #else | |
130 | ||
131 | # define RING_BUFFER_ALIGN_ATTR __attribute__((packed)) | |
132 | ||
133 | /* | |
134 | * Calculate the offset needed to align the type. | |
135 | * size_of_type must be non-zero. | |
136 | */ | |
137 | static inline lttng_ust_notrace | |
138 | unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type); | |
139 | static inline | |
140 | unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) | |
141 | { | |
142 | return 0; | |
143 | } | |
144 | ||
145 | #endif | |
146 | ||
147 | /** | |
148 | * lib_ring_buffer_align_ctx - Align context offset on "alignment" | |
149 | * @ctx: ring buffer context. | |
150 | */ | |
151 | static inline lttng_ust_notrace | |
152 | void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx, | |
153 | size_t alignment); | |
154 | static inline | |
155 | void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx, | |
156 | size_t alignment) | |
157 | { | |
158 | ctx->buf_offset += lib_ring_buffer_align(ctx->buf_offset, | |
159 | alignment); | |
160 | } | |
161 | ||
162 | #endif /* _LTTNG_RING_BUFFER_CONTEXT_H */ |