2 * Copyright (C) 2011 EfficiOS Inc.
3 * Copyright (C) 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
5 * SPDX-License-Identifier: GPL-2.0-only
11 #include "context.hpp"
13 #include "trace-ust.hpp"
14 #include "ust-app.hpp"
16 #include <common/error.hpp>
17 #include <common/sessiond-comm/sessiond-comm.hpp>
23 #include <urcu/list.h>
26 * Add kernel context to all channel.
28 * Assumes the ownership of kctx.
30 static int add_kctx_all_channels(struct ltt_kernel_session
*ksession
,
31 struct ltt_kernel_context
*kctx
)
34 struct ltt_kernel_channel
*kchan
;
36 LTTNG_ASSERT(ksession
);
39 DBG("Adding kernel context to all channels");
41 /* Go over all channels */
42 cds_list_for_each_entry (kchan
, &ksession
->channel_list
.head
, list
) {
43 struct ltt_kernel_context
*kctx_copy
;
45 kctx_copy
= trace_kernel_copy_context(kctx
);
47 PERROR("zmalloc ltt_kernel_context");
48 ret
= -LTTNG_ERR_NOMEM
;
52 /* Ownership of kctx_copy is transferred to the callee. */
53 ret
= kernel_add_channel_context(kchan
, kctx_copy
);
63 trace_kernel_destroy_context(kctx
);
68 * Add kernel context to a specific channel.
70 * Assumes the ownership of kctx.
72 static int add_kctx_to_channel(struct ltt_kernel_context
*kctx
, struct ltt_kernel_channel
*kchan
)
79 DBG("Add kernel context to channel '%s'", kchan
->channel
->name
);
81 /* Ownership of kctx is transferred to the callee. */
82 ret
= kernel_add_channel_context(kchan
, kctx
);
95 * Add UST context to channel.
97 static int add_uctx_to_channel(struct ltt_ust_session
*usess
,
98 enum lttng_domain_type domain
,
99 struct ltt_ust_channel
*uchan
,
100 const struct lttng_event_context
*ctx
)
103 struct ltt_ust_context
*uctx
= NULL
;
109 /* Check if context is duplicate */
110 cds_list_for_each_entry (uctx
, &uchan
->ctx_list
, list
) {
111 if (trace_ust_match_context(uctx
, ctx
)) {
112 ret
= LTTNG_ERR_UST_CONTEXT_EXIST
;
119 case LTTNG_DOMAIN_JUL
:
120 case LTTNG_DOMAIN_LOG4J
:
124 if (ctx
->ctx
!= LTTNG_EVENT_CONTEXT_APP_CONTEXT
) {
125 /* Other contexts are not needed by the agent. */
128 agt
= trace_ust_find_agent(usess
, domain
);
131 agt
= agent_create(domain
);
133 ret
= -LTTNG_ERR_NOMEM
;
136 agent_add(agt
, usess
->agents
);
138 ret
= agent_add_context(ctx
, agt
);
139 if (ret
!= LTTNG_OK
) {
143 ret
= agent_enable_context(ctx
, domain
);
144 if (ret
!= LTTNG_OK
) {
149 case LTTNG_DOMAIN_UST
:
155 /* Create ltt UST context */
156 uctx
= trace_ust_create_context(ctx
);
158 ret
= LTTNG_ERR_UST_CONTEXT_INVAL
;
162 /* Add ltt UST context node to ltt UST channel */
163 lttng_ht_add_ulong(uchan
->ctx
, &uctx
->node
);
164 cds_list_add_tail(&uctx
->list
, &uchan
->ctx_list
);
166 if (!usess
->active
) {
170 ret
= ust_app_add_ctx_channel_glb(usess
, uchan
, uctx
);
175 DBG("Context UST %d added to channel %s", uctx
->ctx
.ctx
, uchan
->name
);
186 * Add kernel context to tracer.
188 int context_kernel_add(struct ltt_kernel_session
*ksession
,
189 const struct lttng_event_context
*ctx
,
190 const char *channel_name
)
193 struct ltt_kernel_channel
*kchan
;
194 struct ltt_kernel_context
*kctx
;
196 LTTNG_ASSERT(ksession
);
198 LTTNG_ASSERT(channel_name
);
200 kctx
= trace_kernel_create_context(NULL
);
202 ret
= -LTTNG_ERR_NOMEM
;
206 /* Setup kernel context structure */
208 case LTTNG_EVENT_CONTEXT_PID
:
209 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_PID
;
211 case LTTNG_EVENT_CONTEXT_PROCNAME
:
212 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_PROCNAME
;
214 case LTTNG_EVENT_CONTEXT_PRIO
:
215 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_PRIO
;
217 case LTTNG_EVENT_CONTEXT_NICE
:
218 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_NICE
;
220 case LTTNG_EVENT_CONTEXT_VPID
:
221 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VPID
;
223 case LTTNG_EVENT_CONTEXT_TID
:
224 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_TID
;
226 case LTTNG_EVENT_CONTEXT_VTID
:
227 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VTID
;
229 case LTTNG_EVENT_CONTEXT_PPID
:
230 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_PPID
;
232 case LTTNG_EVENT_CONTEXT_VPPID
:
233 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VPPID
;
235 case LTTNG_EVENT_CONTEXT_HOSTNAME
:
236 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_HOSTNAME
;
238 case LTTNG_EVENT_CONTEXT_PERF_CPU_COUNTER
:
239 case LTTNG_EVENT_CONTEXT_PERF_COUNTER
:
240 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_PERF_CPU_COUNTER
;
242 case LTTNG_EVENT_CONTEXT_INTERRUPTIBLE
:
243 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_INTERRUPTIBLE
;
245 case LTTNG_EVENT_CONTEXT_PREEMPTIBLE
:
246 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_PREEMPTIBLE
;
248 case LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE
:
249 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_NEED_RESCHEDULE
;
251 case LTTNG_EVENT_CONTEXT_MIGRATABLE
:
252 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_MIGRATABLE
;
254 case LTTNG_EVENT_CONTEXT_CALLSTACK_KERNEL
:
255 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_CALLSTACK_KERNEL
;
257 case LTTNG_EVENT_CONTEXT_CALLSTACK_USER
:
258 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_CALLSTACK_USER
;
260 case LTTNG_EVENT_CONTEXT_CGROUP_NS
:
261 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_CGROUP_NS
;
263 case LTTNG_EVENT_CONTEXT_IPC_NS
:
264 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_IPC_NS
;
266 case LTTNG_EVENT_CONTEXT_MNT_NS
:
267 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_MNT_NS
;
269 case LTTNG_EVENT_CONTEXT_NET_NS
:
270 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_NET_NS
;
272 case LTTNG_EVENT_CONTEXT_PID_NS
:
273 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_PID_NS
;
275 case LTTNG_EVENT_CONTEXT_TIME_NS
:
276 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_TIME_NS
;
278 case LTTNG_EVENT_CONTEXT_USER_NS
:
279 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_USER_NS
;
281 case LTTNG_EVENT_CONTEXT_UTS_NS
:
282 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_UTS_NS
;
284 case LTTNG_EVENT_CONTEXT_UID
:
285 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_UID
;
287 case LTTNG_EVENT_CONTEXT_EUID
:
288 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_EUID
;
290 case LTTNG_EVENT_CONTEXT_SUID
:
291 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_SUID
;
293 case LTTNG_EVENT_CONTEXT_GID
:
294 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_GID
;
296 case LTTNG_EVENT_CONTEXT_EGID
:
297 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_EGID
;
299 case LTTNG_EVENT_CONTEXT_SGID
:
300 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_SGID
;
302 case LTTNG_EVENT_CONTEXT_VUID
:
303 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VUID
;
305 case LTTNG_EVENT_CONTEXT_VEUID
:
306 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VEUID
;
308 case LTTNG_EVENT_CONTEXT_VSUID
:
309 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VSUID
;
311 case LTTNG_EVENT_CONTEXT_VGID
:
312 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VGID
;
314 case LTTNG_EVENT_CONTEXT_VEGID
:
315 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VEGID
;
317 case LTTNG_EVENT_CONTEXT_VSGID
:
318 kctx
->ctx
.ctx
= LTTNG_KERNEL_ABI_CONTEXT_VSGID
;
321 ret
= LTTNG_ERR_KERN_CONTEXT_FAIL
;
325 kctx
->ctx
.u
.perf_counter
.type
= ctx
->u
.perf_counter
.type
;
326 kctx
->ctx
.u
.perf_counter
.config
= ctx
->u
.perf_counter
.config
;
327 strncpy(kctx
->ctx
.u
.perf_counter
.name
, ctx
->u
.perf_counter
.name
, LTTNG_SYMBOL_NAME_LEN
);
328 kctx
->ctx
.u
.perf_counter
.name
[LTTNG_SYMBOL_NAME_LEN
- 1] = '\0';
330 if (*channel_name
== '\0') {
331 ret
= add_kctx_all_channels(ksession
, kctx
);
332 /* Ownership of kctx is transferred to the callee. */
334 if (ret
!= LTTNG_OK
) {
338 /* Get kernel channel */
339 kchan
= trace_kernel_get_channel_by_name(channel_name
, ksession
);
341 ret
= LTTNG_ERR_KERN_CHAN_NOT_FOUND
;
345 ret
= add_kctx_to_channel(kctx
, kchan
);
346 /* Ownership of kctx is transferred to the callee. */
348 if (ret
!= LTTNG_OK
) {
357 trace_kernel_destroy_context(kctx
);
363 * Add UST context to tracer.
365 int context_ust_add(struct ltt_ust_session
*usess
,
366 enum lttng_domain_type domain
,
367 const struct lttng_event_context
*ctx
,
368 const char *channel_name
)
371 struct lttng_ht_iter iter
;
372 struct lttng_ht
*chan_ht
;
373 struct ltt_ust_channel
*uchan
= NULL
;
377 LTTNG_ASSERT(channel_name
);
381 chan_ht
= usess
->domain_global
.channels
;
383 /* Get UST channel if defined */
384 if (channel_name
[0] != '\0') {
385 uchan
= trace_ust_find_channel_by_name(chan_ht
, channel_name
);
387 ret
= LTTNG_ERR_UST_CHAN_NOT_FOUND
;
393 /* Add ctx to channel */
394 ret
= add_uctx_to_channel(usess
, domain
, uchan
, ctx
);
397 /* Add ctx all events, all channels */
398 cds_lfht_for_each_entry (chan_ht
->ht
, &iter
.iter
, uchan
, node
.node
) {
399 ret
= add_uctx_to_channel(usess
, domain
, uchan
, ctx
);
401 ERR("Failed to add context to channel %s", uchan
->name
);
409 case LTTNG_ERR_UST_CONTEXT_EXIST
:
412 case -LTTNG_ERR_NOMEM
:
413 ret
= LTTNG_ERR_FATAL
;
416 ret
= LTTNG_ERR_UST_CONTEXT_INVAL
;
419 ret
= LTTNG_ERR_UNKNOWN_DOMAIN
;
422 if (ret
!= 0 && ret
!= LTTNG_OK
) {
423 ret
= ret
> 0 ? ret
: LTTNG_ERR_UNK
;