1 /* SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only)
3 * lttng-context-vppid.c
7 * Copyright (C) 2009-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
10 #include <linux/module.h>
11 #include <linux/slab.h>
12 #include <linux/sched.h>
13 #include <linux/syscalls.h>
14 #include <lttng/events.h>
15 #include <lttng/events-internal.h>
16 #include <ringbuffer/frontend_types.h>
17 #include <wrapper/vmalloc.h>
18 #include <lttng/tracer.h>
21 size_t vppid_get_size(void *priv
, struct lttng_kernel_probe_ctx
*probe_ctx
, size_t offset
)
25 size
+= lib_ring_buffer_align(offset
, lttng_alignof(pid_t
));
26 size
+= sizeof(pid_t
);
31 void vppid_record(void *priv
, struct lttng_kernel_probe_ctx
*probe_ctx
,
32 struct lttng_kernel_ring_buffer_ctx
*ctx
,
33 struct lttng_kernel_channel_buffer
*chan
)
35 struct task_struct
*parent
;
39 * current nsproxy can be NULL when scheduled out of exit. pid_vnr uses
40 * the current thread nsproxy to perform the lookup.
44 * TODO: when we eventually add RCU subsystem instrumentation,
45 * taking the rcu read lock here will trigger RCU tracing
46 * recursively. We should modify the kernel synchronization so
47 * it synchronizes both for RCU and RCU sched, and rely on
48 * rcu_read_lock_sched_notrace.
52 parent
= rcu_dereference(current
->real_parent
);
53 if (!current
->nsproxy
)
56 vppid
= task_tgid_vnr(parent
);
58 lib_ring_buffer_align_ctx(ctx
, lttng_alignof(vppid
));
59 chan
->ops
->event_write(ctx
, &vppid
, sizeof(vppid
));
63 void vppid_get_value(void *priv
,
64 struct lttng_kernel_probe_ctx
*lttng_probe_ctx
,
65 struct lttng_ctx_value
*value
)
67 struct task_struct
*parent
;
71 * current nsproxy can be NULL when scheduled out of exit. pid_vnr uses
72 * the current thread nsproxy to perform the lookup.
76 * TODO: when we eventually add RCU subsystem instrumentation,
77 * taking the rcu read lock here will trigger RCU tracing
78 * recursively. We should modify the kernel synchronization so
79 * it synchronizes both for RCU and RCU sched, and rely on
80 * rcu_read_lock_sched_notrace.
84 parent
= rcu_dereference(current
->real_parent
);
85 if (!current
->nsproxy
)
88 vppid
= task_tgid_vnr(parent
);
93 static const struct lttng_kernel_ctx_field
*ctx_field
= lttng_kernel_static_ctx_field(
94 lttng_kernel_static_event_field("vppid",
95 lttng_kernel_static_type_integer_from_type(pid_t
, __BYTE_ORDER
, 10),
102 int lttng_add_vppid_to_ctx(struct lttng_kernel_ctx
**ctx
)
106 if (lttng_kernel_find_context(*ctx
, ctx_field
->event_field
->name
))
108 ret
= lttng_kernel_context_append(ctx
, ctx_field
);
109 wrapper_vmalloc_sync_mappings();
112 EXPORT_SYMBOL_GPL(lttng_add_vppid_to_ctx
);